0

Lucene 4 的 Levenshtein 实现声称比以前快 100 倍(http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.html)我想做模糊匹配查询中的所有术语。这个想法是搜索“gren hook”应该能够找到文档“greenhouse”(此时我并不真正关心短语,引号只是为了使其更具可读性)。

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

我目前对实现这一目标的正确方法有点迷茫。我的基本方法是将搜索查询分解为术语并将波浪号/模糊运算符附加到每个术语。因此 'gren hook' 会变成 'gren~hose~' 。现在的问题是如何正确地做到这一点。我可以看到几种方法:

  1. 蛮力:假设术语由空格分隔,因此只需解析查询并在每个空格之前附加一个波浪号(即在每个术语之后)
  2. 两个步骤: 将查询发送到 Solr 并打开查询调试。这将给我一个由 Solr 解析的查询术语列表。然后我可以从调试输出中提取术语,附加波浪号运算符并使用添加的波浪号运算符重新运行查询
  3. 在内部:挂钩到搜索请求处理程序并在查询被解析为术语后附加波浪号运算符

方法 1 很臭,因为它完全绕过了 Solr 的查询解析,所以我宁愿不这样做。如果两次解析查询的成本不太高,方法 2 听起来很可行。方法 3 听起来不错,但我还没有弄清楚我必须在哪里连接到处理链。

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

4

1 回答 1

1

我会提出以下方法:

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

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

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

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

于 2012-12-31T06:00:39.547 回答