1

Рассмотрим следующий JSON файл:Есть ли способ применить синонимный токен-фильтр в ElasticSearch к именам полей, а не к значению?

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

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

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

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

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

ответ

1

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

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

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

В этом примере вы должны указать в своем отображении, что поля в поле 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 mapping: _all field.)

Смежные вопросы