Есть задача сохранять в индексе синонимы для словосочетаний.
Пример:
жидкость омывателя -> омывайка
монопод для селфи, палка для селфи -> селфипалка
Настроил анализатор следующим образом:
PUT /multiwords_synonyms_index
{
"settings": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"монопод для селфи, палка для селфи=>селфипалка"
]
}
},
"analyzer": {
"my_synonyms": {
"tokenizer": "standard",
"filter": [
"lowercase",
"my_synonym_filter"
]
}
}
}
}
}
Фильтр отрабатывает, заменяя словосочетания на указанный в таблице терм:
POST /multiwords_synonyms_index/_analyze?analyzer=my_synonyms
{
"text": "у меня есть монопод для селфи"
}
POST /multiwords_synonyms_index/_analyze?analyzer=my_synonyms
{
"text": "у меня есть селфипалка"
}
{
"tokens": [
{
"token": "text",
"start_offset": 5,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "у",
"start_offset": 22,
"end_offset": 23,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "меня",
"start_offset": 24,
"end_offset": 28,
"type": "<ALPHANUM>",
"position": 5
},
{
"token": "есть",
"start_offset": 29,
"end_offset": 33,
"type": "<ALPHANUM>",
"position": 6
},
{
"token": "селфипалка",
"start_offset": 34,
"end_offset": 51,
"type": "SYNONYM",
"position": 7
}
]
Таким образом, я могу найти все нужные документы по запросу "селфипалка", но по запросу "монопод для селфи" документ найден не будет.
Использую такой запрос:
GET /multiwords_synonyms_index/data/_search
{
"from": 0,
"size": 10,
"query": {
"filtered": {
"query": {
"function_score": {
"query": {
"simple_query_string": {
"query": "монопод для селфи",
"fields": [
"name"
],
"default_operator": "or",
"analyzer": "my_synonyms",
"minimum_should_match": "1"
}
}
}
}
}
}
}
Как можно решить эту задачу? Может быть, есть возможность сохранять исходные термы, или обязательно использовать match_phrase?