1

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

你知道我可以使用什么不同的方法吗?如果可能的话,我想以更快的方式使用模糊搜索功能。

非常感谢!

4

1 回答 1

3

您的问题与您使用的分析仪无关。当您搜索 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 - 拼写检查器

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 距离,但不是迭代所有术语,而是仅计算相关术语的距离。

您需要先对“Californa”执行拼写检查,它会建议您使用“Californa”。然后,您可以在主索引的查询中使用“California”,而无需进行模糊查询。

2- 自动建议

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

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

于 2012-06-04T22:45:28.043 回答