【问题标题】:Elastic search or Trie for search/autocomplete?用于搜索/自动完成的弹性搜索或 Trie?
【发布时间】:2018-12-07 16:06:10
【问题描述】:

我对文本/项目的自动完成/搜索如何在任何可扩展产品(如高级亚马逊电子商务/谷歌)中的高级工作的理解是:-

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

  1. 文档存储在 DB 中。一旦持久化给弹性搜索,它就会创建索引并将索引/文档(基于标记器)存储在内存或基于磁盘的 配置。

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

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

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

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

【问题讨论】:

    标签: algorithm elasticsearch autocomplete trie


    【解决方案1】:

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

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

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

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

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

    就实现而言,有限状态转换器接近于 trie。您可以查看此excellent article,它显示了triefinite 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

    【讨论】:

    • ES 7.2 的更新答案
    猜你喜欢
    • 2023-04-09
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多