#elasticsearch
#эластичный поиск #elasticsearch
Вопрос:
Я использую elasticsearch 6 и у меня есть полное текстовое поле в индексе. Это поле хранит категорию продукта и может принимать только одно из нескольких возможных значений (например, фрукты, листовые овощи и т.д.). Я хочу проанализировать поле пользовательским способом с помощью токенов, указанных в файле.
Например
свежие фрукты->[фрукты, fresh fruit]
Есть ли способ использовать пользовательский анализатор с конечными токенами, поступающими из файла сопоставления, как указано выше.
Ответ №1:
То, что вы ищете, — это фильтр токенов синонимов. Вам нужно создать пользовательский анализатор, который использовал этот фильтр, чтобы при вводе строки fresh fruit
или fruit
затем он генерировал один токен fruit
. Вы можете достичь этого, определив анализ в настройках индекса. Создайте пользовательский анализатор, который использует фильтр, а затем примените этот анализатор к category
полю, как показано ниже:
PUT my_index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"my_synonym_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"custom_synonym"
]
}
},
"filter": {
"custom_synonym": {
"type": "synonym",
"synonyms": [
"fresh fruit, fruit => fruit"
],
//"synonyms_path": "analysis/synonyms.txt" <---- replace "synonyms" above with this to use file instead of array of synonyms
}
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"category": {
"type": "text",
"analyzer": "my_synonym_analyzer"
}
}
}
}
}
Теперь при поиске либо fruit
либо fresh fruit
по category
полевым документам будут совпадать либо fruit
либо fresh fruit
. Это связано с тем, что при поиске по полю elastic search по умолчанию использует тот же анализатор для строки поиска, который был применен к полю при индексации, что в этом случае в конечном итоге сводится к fruit
в любом случае ( fruit
или fresh fruit
), и, следовательно, документы будут совпадать.
Комментарии:
1. Спасибо за подход, это, безусловно, может сработать. Если, скажем, мне нужно добавить новые сопоставления в файл синонимов, то требует ли это закрытия-открытия индекса? ИЛИ переиндексация?
2. В этом случае вам придется перезапустить узлы.
3. @SauravPrakash Это решило вашу проблему? Если да, пожалуйста, не стесняйтесь принять и поддержать.