Используйте множественный анализатор в эластичном поиске (автозаполнение и фонетический).
Алгоритм анализа хорошо работает в автозаполнении с нечетким соответствием, но нечеткое соответствие не так хорошо, поэтому я хотел добавить фонетический анализатор к тому же индексу фамилии. Я просмотрел много документации и не нашел хорошей о том, как использовать 2 анализатора.
"settings": {
"analysis": {
"analyzer": {
"autocomplete_analyzer": {
"type": "custom",
"tokenizer": "autocomplete_tokenizer",
"filter": [
"lowercase"
]
},
"phonetic_analyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"phonetic"
]
}
},
"tokenizer": {
"autocomplete_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 10,
"token_chars": ["letter", "digit"]
}
}
}
},
"mappings": {
"properties": {
"full_name": {
"type": "text",
"analyzer": "autocomplete_analyzer"
},
"relation_name": {
"type": "text",
},
"address": {
"type": "text"
}
}
}
}
Замысловатый ответ ...
Хотя использование нескольких анализаторов для одного поля невозможно (за исключением того, что вы можете использовать разные анализаторы при index
или search
), хитрый способ сделать это - использовать функцию copy_to
в elasticsearch.
Поэтому вы можете добавить еще одно поле, например full_name_phonetic
, как показано ниже, и при поиске запрашивать оба поля.
{
"mappings": {
"properties": {
"full_name_phonetic": {
"type": "text",
"analyzer": "phonetic_analyzer"
},
"full_name": {
"type": "text",
"copy_to": "full_name_phonetic"
"analyzer": "autocomplete_analyzer"
},
"relation_name": {
"type": "text",
},
"address": {
"type": "text"
}
}
}
}