我的理解是,在诸如Amazon eCommerce / Google之类的任何可扩展产品中,自动完成/搜索文本/项目都可以在高水平上实现高水平:-
基于弹性搜索(ES)的方法
文档存储在DB中。一旦持久化给弹性搜索,它就会创建索引并将索引/文档(基于令牌生成器)存储在基于内存或磁盘的存储中 配置。
一旦用户键入3个字符,它将在ES下搜索所有索引(可以配置为甚至对ngram进行索引),根据权重对它们进行排名并返回给用户
但是在阅读了Trie based search等Google上的一些资源后
看起来有些可伸缩产品还使用Trie
数据结构来进行基于前缀的搜索。
我的问题是,基于trie的方法是否可以替代ES,或者ES内部使用Trie
,还是我在这里完全迷失了?
答案 0 :(得分:3)
ES自动补全可以通过两种方式实现:
第一个选择是穷人的修养功能。我之所以提及它,是因为它在某些情况下很有用,但是如果您有大量文档,则应避免使用它。
第二个选项使用常规的ES索引功能,即它将标记文本,所有(edge-)ngram都将被索引,然后您可以搜索已被索引的任何前缀/中缀/后缀。
第三个选项使用了不同的方法,并针对速度进行了优化。基本上,在索引类型为completion
的字段时,ES将创建一个"finite state transducer"并将其存储在内存中以进行超快速访问。
就实现而言,有限状态换能器非常接近。您可以检查此excellent article,以显示trie与finite state transducer的比较