ES автозаполнение может быть достигнуто двумя способами:
- с использованием
prefix
запросов
- либо с использованием (edge-) нграмм
- или используйте подсказку для завершения
Первый вариант - функция завершения бедняка. Я упоминаю об этом, потому что это может быть полезно в определенной ситуации, но вам следует избегать этого, если у вас есть значительное количество документов.
Во втором варианте используются обычные функции индексации ES, то есть он будет маркировать текст, будут индексированы все (крайние) нграммы, а затем вы сможете искать любой префикс / инфикс / суффикс, который был проиндексирован.
Третий вариант использует другой подход и оптимизирован для скорости. По сути, при индексировании поля типа completion
ES создаст «датчик конечного состояния» и сохранит его в памяти для сверхбыстрого доступа.
Конечный преобразователь состояния близок к три с точки зрения реализации. Вы можете проверить эту отличную статью , в которой показано, как trie сравнивается с конечным преобразователем состояния
ОБНОВЛЕНИЕ (25 июня 2019 г.):
В ES 7.2 был введен новый тип данных под названием search_as_you_type
, который допускает такое поведение изначально. Подробнее на: https://www.elastic.co/guide/en/elasticsearch/reference/7.2/search-as-you-type.html