Существует несколько способов реализовать функцию автозаполнения, и нечеткий поиск не является правильным (в основном он используется для поиска связанных документов по токенам (de-dupe), а в проверке орфографии см. this для приложений нечеткого поиска).
В вашем случае, я бы предложил , используя запрос префикса , если ваш размер индекса не велик и ограничьте минимальную длину символа до два , т. е. не ищет e
и показывает результаты поиска только тогда, когда пользователь набрал два или более символов ie em
или emi
, emin
et c.
Рабочий пример
Отображение индекса
{
"mappings": {
"properties": {
"artistName": {
"type": "text"
}
}
}
}
Индекс до c
{
"artistName" : "Eminem"
}
{
"artistName" : "Emiten"
}
Поисковый запрос
{
"query": {
"prefix": {
"artistName": {
"value": "em"
}
}
}
}
Результат поиска
{
"_index": "so-60558525-auto",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"artistName": "Eminem"
}
},
{
"_index": "so-60558525-auto",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"artistName": "Emiten"
}
}
Важно прочитать
Существует в целом четыре подхода, которые вы можете выбрать для реализации автозаполнения , и у каждого из них есть свой компромисс, который Вы должны знать, как оправдать свои функциональные требования, а также нефункциональные (производительность, обслуживание, трудности с реализацией).
Учитывая важность и наличие функции Autocomplete
в современных поисковых системах, существует подробный блог , подробно описывающий все подходы и их компромисс.