Solr中每个查询项的模糊匹配

时间:2012-12-31 01:05:56

标签: solr lucene levenshtein-distance fuzzy-search

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. 蛮力:假设这些术语是由空格分隔的,所以只需解析查询并在每个空格之前附加一个波浪号(即每个术语之后)
  2. 两个步骤:将查询发送到Solr并打开查询调试。这将给出一个Solr解析的查询术语列表。然后我可以从调试输出中提取术语,附加波浪号运算符并使用添加的波浪号运算符重新运行查询
  3. 内部:挂钩到搜索请求处理程序并在将查询解析为术语后附加波浪号运算符
  4. 方法1很糟糕,因为它完全绕过了Solr的查询解析,所以我宁愿不这样做。如果解析查询两次的成本不是太高,方法2听起来很可行。方法3听起来恰到好处,但我还没弄清楚我必须在哪里挂钩处理链。

    也许有一种完全不同的方式可以实现我想做的事情,或者这对我来说可能只是一个愚蠢的想法。无论如何,我真的很感激一些指针,也许其他人已经做过这样的事情了。谢谢!

1 个答案:

答案 0 :(得分:1)

我建议采用以下方法:

  1. 在您的应用程序中实现一个查询处理程序模块,您可以在其中根据输入用户查询构建solr查询。这样,SOLR方面没有任何变化,您的应用程序可以完全控制SOLR中的内容。

  2. 实现自己的查询解析器,您可以从标准SOLR查询解析器(org.apache.solr.search.QParser)开始并进行更改。您的应用程序只需要选择您的自定义查询解析器,并且应该小心实施。

  3. 我更喜欢方法1,因为这使得系统与SOLR升级完全无关,Solr的任何新版本都不需要我更新自定义qparser,您不必在新的更新/构建和设置自定义qparser版本

    如果您对应用程序没有任何控制权并且不想通过qparser路由,那么您可以实现一个Servlet过滤器,在将solr查询分派到solr请求过滤器之前对其进行转换。