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

Solr中每个查询项的模糊匹配,solr,lucene,levenshtein-distance,fuzzy-search,Solr,Lucene,Levenshtein Distance,Fuzzy Search,由于Lucene 4的Levenshtein实现声称比以前快100倍(),我想对查询中的所有术语进行模糊匹配。这个想法是,搜索“gren hose”应该能够找到文档“green house”(我现在并不真正关心短语,这里的引用只是为了让它更可读) 我正在使用Lucene 4+Solr 4。在我进行一些预处理和后处理时,Solr周围有一个小的包装servlet,该servlet使用SolrJ最终访问Solr 我现在有点迷茫,不知道什么才是实现这一目标的正确方法。我的基本方法是将搜索查询分解为多个术

由于Lucene 4的Levenshtein实现声称比以前快100倍(),我想对查询中的所有术语进行模糊匹配。这个想法是,搜索“gren hose”应该能够找到文档“green house”(我现在并不真正关心短语,这里的引用只是为了让它更可读)

我正在使用Lucene 4+Solr 4。在我进行一些预处理和后处理时,Solr周围有一个小的包装servlet,该servlet使用SolrJ最终访问Solr

我现在有点迷茫,不知道什么才是实现这一目标的正确方法。我的基本方法是将搜索查询分解为多个术语,并将tilde/fuzzy运算符附加到每个术语。因此,“gren hose”将变成“gren~hose~”。现在的问题是如何正确地做到这一点。我可以看到几种方法:

  • 暴力:假设术语由空格分隔,因此只需解析查询并在每个空格之前(即每个术语之后)附加一个波浪号
  • 两个步骤:在打开查询调试的情况下将查询发送到Solr。这将为我提供一个由Solr解析的查询词列表。然后,我可以从调试输出中提取术语,附加tilde操作符,并使用添加的tilde操作符重新运行查询
  • 内部:钩住搜索请求处理程序,并在将查询解析为术语后附加tilde操作符
  • 方法1非常糟糕,因为它完全绕过了Solr的查询解析,所以我不想这样做。如果两次解析查询的成本不太高,那么方法2听起来非常可行。方法3听起来恰到好处,但我还没有弄清楚在哪里我必须连接到处理链中


    也许有一种完全不同的方式来实现我想做的事情,或者这只是我一个愚蠢的想法。不管怎样,我真的很感激你给我一些建议,也许其他人已经做过类似的事情了。谢谢

    我将提出以下方法:

  • 在应用程序中实现一个查询处理程序模块,您可以从输入用户查询中构建solr查询。这样,SOLR端不会发生任何变化,应用程序可以控制进入SOLR的内容

  • 实现您自己的查询解析器,您可以从标准的SOLR查询解析器(org.apache.SOLR.search.QParser)开始进行更改。您的应用程序只需要选择您的自定义查询解析器,您的实现应该注意其他方面

  • 我更喜欢方法1,因为这使得系统对SOLR升级完全不可知,SOLR的任何新版本都不需要我更新定制qparser,您也不必在新版本中更新/构建和设置定制qparser

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