Levenshtein实现Lucene 4声称比以前快100倍(http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.html)我想在查询中对所有术语进行模糊匹配。我们的想法是,搜索'gren hose'应该能够找到文档'green house'(我现在并不关心短语,引用只是为了让它更具可读性)。
我正在使用Lucene 4 + Solr 4.当我正在进行一些预处理和后处理时,Solr周围有一个小的包装器servlet,servlet正在使用SolrJ来最终访问Solr
我目前对实现这一目标的正确方法感到有些失落。我的基本方法是将搜索查询分解为术语,并将波浪/模糊运算符附加到每个术语。因此'gren hose'会成为'gren~hose〜'。现在的问题是如何正确地做到这一点。我可以看到几种方式:
方法1很糟糕,因为它完全绕过了Solr的查询解析,所以我宁愿不这样做。如果解析查询两次的成本不是太高,方法2听起来很可行。方法3听起来恰到好处,但我还没弄清楚我必须在哪里挂钩处理链。
也许有一种完全不同的方式可以实现我想做的事情,或者这对我来说可能只是一个愚蠢的想法。无论如何,我真的很感激一些指针,也许其他人已经做过这样的事情了。谢谢!
答案 0 :(得分:1)
我建议采用以下方法:
在您的应用程序中实现一个查询处理程序模块,您可以在其中根据输入用户查询构建solr查询。这样,SOLR方面没有任何变化,您的应用程序可以完全控制SOLR中的内容。
实现自己的查询解析器,您可以从标准SOLR查询解析器(org.apache.solr.search.QParser)开始并进行更改。您的应用程序只需要选择您的自定义查询解析器,并且应该小心实施。
我更喜欢方法1,因为这使得系统与SOLR升级完全无关,Solr的任何新版本都不需要我更新自定义qparser,您不必在新的更新/构建和设置自定义qparser版本
如果您对应用程序没有任何控制权并且不想通过qparser路由,那么您可以实现一个Servlet过滤器,在将solr查询分派到solr请求过滤器之前对其进行转换。