Есть ли способ применить фильтр токенов синонимов в ElasticSearch к именам полей, а не к значению?

Рассмотрим следующий файл JSON:

{
  "titleSony": "Matrix",
  "cast": [
    {
      "firstName": "Keanu",
      "lastName": "Reeves"
    }
  ]
}

Теперь, как я знаю, в ElasticSearch вы можете применить фильтр токена синонима к значениям поля, как указано в следующей ссылке: Анализ Elasticsearch: фильтр токенов синонимов.

Следовательно, я могу создать файл «synonym.txt» с Matrix => Matx, тогда, если я буду искать titleSony:Matx, он также вернет документы с Matrix.

Теперь я хотел бы создать синоним для имени поля titleSony. Например - titleSony => titleAll, так что когда я ищу titleAll, я также должен получить все документы с titleSony.

Есть ли способ сделать это в ElasticSearch?


person Rohan    schedule 20.01.2015    source источник


Ответы (1)


Теперь я хотел бы создать синоним для имени поля «titleSony». Например, titleSony => titleAll , поэтому, когда я ищу «titleAll», я также должен получить все документы с «titleSony».

Да, несколько. Elasticsearch имеет некоторое поведение по умолчанию, очень похожее на это, о котором я немного расскажу.

Функция, которую вы ищете, называется "Копировать в поле." Это позволяет вам указать, что термины в одном поле должны быть скопированы в другое. Это полезно для объединения терминов, которые, как вы ожидаете, будут соответствовать в одном поле, чтобы упростить ваш запрос, когда вы хотите сопоставить любое из нескольких полей.

В этом примере вы должны указать в своем сопоставлении, что термины в поле titleSony должны быть скопированы в поле titleAll. Предположительно, у вас должны быть другие поля (скажем, titleDisney), которые также копируются в это поле. Таким образом, поиск по titleAll будет эффективно соответствовать другим полям, термины которых копируются в него.

Фрагмент вашего сопоставления может выглядеть примерно так:

{
  "movies" : {
    "properties" : {
      "titleSony" :   { "type" : "string", "copy_to" : "titleAll" },
      "titleDisney" : { "type" : "string", "copy_to" : "titleAll" },
      "titleAll" :    { "type" : "string" },
      "cast" : { ... },
      ...
    }
}

Ранее я упоминал, что Elasticsearch делает что-то подобное. По умолчанию создается специальное поле с именем _all, в которое копируются все термины документа. Это поле позволяет создавать очень простые запросы для сопоставления с терминами, встречающимися в любом поле документа. Как видите, это довольно распространенное соглашение в Elasticsearch. (сопоставление Elasticsearch: _все поля. )

person Nick Zadrozny    schedule 20.01.2015