Эластичный поиск или три для поиска / автозаполнения? - PullRequest
0 голосов
/ 28 июня 2018

Мое понимание того, как автозаполнение / поиск текста / элемента работает на высоком уровне в любом масштабируемом продукте, таком как Amazon eCommerce / Google на высоком уровне, было: -

Подход на основе эластичного поиска (ES)

  1. Документы хранятся в БД. После того, как данные сохраняются для поиска Elastic, он создает индекс и сохраняет индекс / документ (на основе токенизатора) в памяти или на диске. конфигурации.

  2. Как только пользователь вводит 3 символа, он выполняет поиск по всему индексу в ES (можно настроить индексирование даже по ngram), ранжировать их по весу и возвращать пользователю

Но после прочтения нескольких ресурсов в Google вроде Поиск по Trie

Похоже, что некоторые из масштабируемых продуктов также используют структуру данных Trie для поиска по префиксам.

Мой вопрос: может ли подход, основанный на trie, быть хорошей альтернативой ES или ES использует внутренне Trie или я здесь полностью отсутствует?

1 Ответ

0 голосов
/ 28 июня 2018

ES автозаполнение может быть достигнуто двумя способами:

  1. с использованием prefix запросов
  2. либо с использованием (edge-) нграмм
  3. или используйте подсказку для завершения

Первый вариант - функция завершения бедняка. Я упоминаю об этом, потому что это может быть полезно в определенной ситуации, но вам следует избегать этого, если у вас есть значительное количество документов.

Во втором варианте используются обычные функции индексации 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

...