Solr / Lucene模糊搜索太慢了

时间:2012-06-04 12:05:17

标签: solr full-text-search search-engine lucene

我正在尝试使用Solr服务器实现位置(城市,地区,国家,对象)模糊搜索。目前,我的索引包含大约0.8-1.0 M项。它使用模糊搜索(~0.7)非常好用,但对我来说太慢了(经常0.2-0.6秒)。使用的标记生成器是<tokenizer class="solr.StandardTokenizerFactory"/>。作为替代方案,我尝试<tokenizer class="solr.WhitespaceTokenizerFactory"/> - 它在性能方面很好(大约快100倍),但它不提供模糊搜索:(

您知道我可以使用的任何不同方法吗?我想使用模糊搜索功能,但如果可能的话,以更快的方式受益。

非常感谢!

1 个答案:

答案 0 :(得分:2)

您的问题与您使用的分析仪无关。当你搜索Califrna~0.7时,Lucene迭代索引中的所有项并计算“Califrna”和所有项之间的(Levenshtein)编辑距离。这是一项非常昂贵的操作。

此问题将通过Lucene 4.0版解决。不幸的是,Solr附带的Lucene版本正在使用旧的强力方法。

https://issues.apache.org/jira/browse/LUCENE-2089

http://java.dzone.com/news/lucenes-fuzzyquery-100-times

如果你没问题,我建议从trunk下载Solr / Lucene并测试新模糊查询的工作原理。

http://wiki.apache.org/solr/NightlyBuilds

即使行李箱稳定,也不建议用于生产。我可以建议你两种类似的方法:

1 - SpellChecker

http://wiki.apache.org/solr/SpellCheckComponent

http://www.lucidimagination.com/blog/2010/08/31/getting-started-spell-checking-with-apache-lucene-and-solr/

SpellChecker使用n-gram构建其小索引,以便执行快速查找。它也使用Levenshtein距离,但不是迭代所有项,它只计算相关项的距离。

你需要先为“Califrna”执行拼写检查,它会建议你“Californa”。然后,您可以在主查询的查询中使用“加利福尼亚”,而无需模糊查询。

2-自动建议

http://wiki.apache.org/solr/Suggester

您可以使用suggester组件提供正确的拼写作为用户类型查询。这会快得多。它支持使用JaspellLookup类进行模糊搜索。需要更新JaspellLookup才能启用模糊搜索。 Wiki并没有说明需要更新的内容。如果usePrefix设置为false,我应该执行模糊查找。