search/autocomplete 的弹性搜索或 Trie?

Elastic search or Trie for search/autocomplete?

我对 autocomplete/search for text/item 如何在任何可扩展产品(如亚马逊 eCommerce/Google 的高层)中的高层工作的理解是:-

基于弹性搜索 (ES) 的方法

  1. 文档存储在数据库中。一旦持久化给弹性搜索,它就会创建索引并将 index/document(基于分词器)存储在内存或基于磁盘中 配置.

  2. 一旦用户输入 3 个字符,它会搜索 ES 下的所有索引(可以配置为甚至索引 ngram),根据权重和 return 对用户进行排名

但是在 google 上阅读了一些资源后,比如 Trie based search

看起来一些可扩展的产品也使用 Trie 数据结构来进行基于前缀的搜索。

我的问题是基于 trie 的方法是否可以很好地替代 ES 或 ES 内部使用 Trie 还是我在这里完全遗漏了?

ES自动补全可以通过两种方式实现:

  1. 使用prefix queries
  2. 要么使用 (edge-)ngrams
  3. 或使用 completion suggester

第一个选项是穷人的补全功能。我提到它是因为它在某些情况下很有用,但如果您有大量文档,则应避免使用它。

第二个选项使用传统的 ES 索引功能,即它将标记文本,所有(边缘)ngram 都将被索引,然后您可以搜索任何已被索引的 prefix/infix/suffix。

第三个选项使用不同的方法并针对速度进行了优化。基本上,当索引一个completion类型的字段时,ES会创建一个"finite state transducer"并将其存储在内存中以实现超快速访问。

有限状态转换器在实现方面接近于特里树。你可以检查这个excellent article which shows how trie compares to finite state transducer

更新(2019 年 6 月 25 日):

ES 7.2 引入了一种名为 search_as_you_type 的新数据类型,它本身就允许这种行为。阅读更多:https://www.elastic.co/guide/en/elasticsearch/reference/7.2/search-as-you-type.html