Я недавно читал о Lucene и Elasticsearch, и, похоже, верно следующее (поправьте меня, если я ошибаюсь):
- префиксные запросы медленнее, чем термические запросы
- суффиксные запросы (* ing) медленнее, чем префиксные (ing *)
Это кажется странным сочетанием свойств. Возможно, мне нужно расширить круг рассматриваемых мной структур данных, но если бы сегмент был структурирован как хэш-таблица, я мог бы легко увидеть, что 1 будет истинным (термин запрос будет O (1), а префиксный запрос будет требуется полное сканирование), однако 2 не будет истинным (и префикс, и суффикс потребуют полного сканирования). Если бы сегмент был расположен как отсортированный массив, я мог бы легко увидеть, что 2 будет истинным (префиксный запрос может быть выполнен с двоичным поиском O (log n), а суффикс потребует полного сканирования), однако 1 больше не будет быть истинным (и термин, и префиксный запрос потребуют двоичного поиска).
Моя единственная другая мысль заключается в том, что может быть какая-то комбинация хэша и сортировки, чтобы учесть это поведение (например, хэш для некоторого раздела и сортировка внутри этого раздела). Однако я понимаю, что Elasticsearch разделяет по идентификатору документа, но инвертированный индексный ключ является термином. Таким образом, запрос термина по-прежнему требует отправки запроса во все разделы.
Может ли кто-нибудь дать мне некоторую интуицию относительно того, как / почему существует такое поведение?
Примечание:
https://www.youtube.com/watch?v=T5RmMNDR5XI предполагает, что сегмент структурирован как отсортированный массив, а не как хеш-таблица.
Я считаю, что 1 верно, потому что https://medium.com/@mourjo_sen/a-detailed-comparison-between-autocompletion-strategies-in-elasticsearch-66cb9e9c62c4 упоминает Самая важная причина, по которой запросы, подобные префиксу, никогда не должны использоваться в производственных средах, заключается в том, что они очень медленные. Причина этого в том, что токены в ES не имеют прямого префикса.
Я считаю, что 2 верно, потому что https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html упоминает разрешение использования подстановочного знака в начале слова (например, * ing) особенно сложен, потому что необходимо проверить все термины в указателе на случай, если они совпадают