我正在构建一个自动完成功能,必须快速查询1000多万个单词/短语,并遇到一些问题。我的第一个想法是通过某种trie / ternary树结构,但那些是严格的前缀匹配,这对我的应用程序来说不够好(我想要完整的中缀匹配)。然后我转向了一些更大的解决方案,SqlServer FullText Indexing,Lucene,Solr,Sphinx,但Lucene和SqlServer FullText Indexing实际上并不是全文,而是带有漂亮功能的前缀(soundex,proximity等)。我试着想办法Levenshtein编辑距离可能会有所帮助,但找不到一种方法,既可以至少相当准确,也可以找到支持高编辑距离的词(即google和ogl。编辑距离为3,但是3是一般情况下高门槛的方法)。
我的问题是,Google / bing等强国如何做到这一点?他们只是稍微蛮力了吗?我想不会,但我找不到任何支持。
任何帮助将不胜感激!
答案 0 :(得分:0)
Lucene / Solr可以很容易地做到这一点。 Lucene / Solr中的搜索单位是Term,通常是一个单词,但几乎可以是任何单词,具体取决于text analysis的配置方式。
使用Solr,有很多方法可以实现它(ngrams / shingles,facet prefix,TermsComponent,...)。最新版本的Solr附带了autocomplete based on spell checking的特定组件。
答案 1 :(得分:0)
如果您在Lucene中启用queryParser.setAllowLeadingWildcard(true);
,则可以使用前导和尾随通配符,例如:
*talli*
那将会包含所有包含“talli”的单词术语,包括“Metallica”。
这对你来说可能不够快,但在某些情况下(仅限前缀的通配符搜索是准确的)如果你可以预处理查询字符串,你可以用旧的“反转术语和索引”也是“技巧:
acillateM
答案 2 :(得分:0)
2013年我需要中缀搜索时,我做了一些研究。我发现的唯一方法是Sphinx engine。需要将其配置为支持中缀搜索
index tra
{
[...]
enable_star=1
min_infix_len=2
}
在此之后,它处理眨眼问题。我认为这是大约200K的搜索记录。我使用本地引擎来模仿内存中的搜索库。