У меня есть индекс, в котором я пытаюсь принудительно добавить начальный токен и конечный токен.(Большая картинка. Я пытаюсь использовать match_phrase для соответствия всей фразе, а не только подфразе адреса).У меня есть рабочий char_filter, который выполняет это, но, похоже, вызывает проблемы с фильтрами синонимов.Все это делается в ElasticSearch 6.2.14.
Вот наименьшая часть работы, которую я должен продемонстрировать в своей проблеме:
{
"settings": {
"analysis": {
"analyzer": {
"working_street_analyzer": {
"type": "custom",
"char_filter": [
"html_strip"
],
"tokenizer": "classic",
"filter": [
"street_synonyms"
]
},
"broken_street_analyzer": {
"type": "custom",
"char_filter": [
"extraTokenAtEnds"
],
"tokenizer": "classic",
"filter": [
"street_synonyms"
]
}
},
"char_filter": {
"extraTokenAtEnds": {
"type": "pattern_replace",
"pattern": "^(.*)$",
"replacement": "wordyword $1 wordyword"
}
},
"filter": {
"street_synonyms": {
"type": "synonym",
"synonyms": [
"south, s",
"west, w"
]
}
}
}
}
}
Вот две проверки конечной точки _analyze:
{
"analyzer": "working_street_analyzer",
"text": "40 s 50 w"
}
{
"analyzer": "broken_street_analyzer",
"text": "40 s 50 w"
}
working_street_analyzer дает то, что вы ожидаете:
{
"tokens": [
{
"token": "40",
"start_offset": 0,
"end_offset": 2,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "s",
"start_offset": 3,
"end_offset": 4,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "south",
"start_offset": 3,
"end_offset": 4,
"type": "SYNONYM",
"position": 1
},
{
"token": "50",
"start_offset": 5,
"end_offset": 7,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "w",
"start_offset": 8,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "west",
"start_offset": 8,
"end_offset": 9,
"type": "SYNONYM",
"position": 3
}
]
}
broken_street_analyzer пропускает шаг синонима.Запуск _analyze с «объяснением»: «истина» показывает, что шаг синонима действительно выполнен, просто не удается найти синонимы:
{
"tokens": [
{
"token": "wordyword",
"start_offset": 0,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "40",
"start_offset": 8,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "s",
"start_offset": 8,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 2
},
{
"token": "50",
"start_offset": 8,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 3
},
{
"token": "w",
"start_offset": 8,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 4
},
{
"token": "wordyword",
"start_offset": 8,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 5
}
]
}