Отображение Elasticsearch: как анализировать или сопоставлять числовые поля?

Я хочу проиндексировать поле month записи bibtex в elasticsearch и сделать его доступным для поиска с помощью запроса range. Это требует, чтобы базовый тип поля был каким-то числовым типом данных. В моем случае short было бы достаточно.

Поле bibtex month в его канонической форме требует трехсимвольной аббревиатуры, поэтому я попытался использовать char_filter следующим образом:

...
"char_filter": {
    "month_char_filter": {
        "type": "mapping",
        "mappings": [
            "jan => 1",
            "feb => 2",
            "mar => 3",
            ...
            "nov => 11",
            "dec => 12"
        ]
    }
...
"normalizer": {
    "month_normalizer": {
        "type": "custom",
        "char_filter": [ "month_char_filter" ],
    },

И поставить сопоставления следующим образом:

...
"month": {
    "type": "short",
    "normalizer": "month_normalizer"
},
...

Но, похоже, это не работает, так как поле type не поддерживает подобные нормализаторы, а также не поддерживает анализаторы.

Итак, каков подход к реализации такого сопоставления, как показано в части char_filter, чтобы были возможности запроса диапазона?


person Thurse    schedule 08.05.2019    source источник


Ответы (1)


Ваш подход интуитивно понятен, однако нормализаторы можно применять только к keyword полям, а анализаторы — к text полям.

Другим подходом может быть использование процессоров загрузки и используйте script процессор для выполнения это отображение во время индексации.

Ниже вы можете найти симуляцию такого процессора script, который создаст новое поле с именем monthNum на основе месяца, представленного в поле month.

POST _ingest/pipeline/_simulate
{
  "pipeline": {
    "processors": [
      {
        "script": {
          "source": """
          def mapping = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
          ctx.monthNum = mapping.indexOf(ctx.month) + 1;
          """
        }
      }
    ]
  },
  "docs": [
    {
      "_source": {
        "month": "feb"
      }
    },
    {
      "_source": {
        "month": "mar"
      }
    },
    {
      "_source": {
        "month": "jul"
      }
    },
    {
      "_source": {
        "month": "aug"
      }
    },
    {
      "_source": {
        "month": "nov"
      }
    },
    {
      "_source": {
        "month": "dec"
      }
    },
    {
      "_source": {
        "month": "xyz"
      }
    }
  ]
}

Итоговые документы:

{
  "docs" : [
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_type",
        "_id" : "_id",
        "_source" : {
          "monthNum" : 2,
          "month" : "feb"
        },
        "_ingest" : {
          "timestamp" : "2019-05-08T12:28:27.006Z"
        }
      }
    },
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_type",
        "_id" : "_id",
        "_source" : {
          "monthNum" : 3,
          "month" : "mar"
        },
        "_ingest" : {
          "timestamp" : "2019-05-08T12:28:27.006Z"
        }
      }
    },
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_type",
        "_id" : "_id",
        "_source" : {
          "monthNum" : 7,
          "month" : "jul"
        },
        "_ingest" : {
          "timestamp" : "2019-05-08T12:28:27.006Z"
        }
      }
    },
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_type",
        "_id" : "_id",
        "_source" : {
          "monthNum" : 8,
          "month" : "aug"
        },
        "_ingest" : {
          "timestamp" : "2019-05-08T12:28:27.006Z"
        }
      }
    },
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_type",
        "_id" : "_id",
        "_source" : {
          "monthNum" : 11,
          "month" : "nov"
        },
        "_ingest" : {
          "timestamp" : "2019-05-08T12:28:27.006Z"
        }
      }
    },
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_type",
        "_id" : "_id",
        "_source" : {
          "monthNum" : 12,
          "month" : "dec"
        },
        "_ingest" : {
          "timestamp" : "2019-05-08T12:28:27.006Z"
        }
      }
    },
    {
      "doc" : {
        "_index" : "_index",
        "_type" : "_type",
        "_id" : "_id",
        "_source" : {
          "monthNum" : 0,
          "month" : "xyz"
        },
        "_ingest" : {
          "timestamp" : "2019-05-08T12:28:27.006Z"
        }
      }
    }
  ]
}
person Val    schedule 08.05.2019
comment
Спасибо, это два совершенно новых аспекта для меня, я сейчас же углублюсь в них! :) Я думаю, что сценарии - это путь в любом случае, потому что я даже не могу гарантировать, что каждая запись month соответствует рекомендациям по трем символам. - person Thurse; 08.05.2019