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~' 。现在的问题是如何正确地做到这一点。我可以看到几种方法:
- 蛮力:假设术语由空格分隔,因此只需解析查询并在每个空格之前附加一个波浪号(即在每个术语之后)
- 两个步骤: 将查询发送到 Solr 并打开查询调试。这将给我一个由 Solr 解析的查询术语列表。然后我可以从调试输出中提取术语,附加波浪号运算符并使用添加的波浪号运算符重新运行查询
- 在内部:挂钩到搜索请求处理程序并在查询被解析为术语后附加波浪号运算符
方法 1 很臭,因为它完全绕过了 Solr 的查询解析,所以我宁愿不这样做。如果两次解析查询的成本不太高,方法 2 听起来很可行。方法 3 听起来不错,但我还没有弄清楚我必须在哪里连接到处理链。
也许有一种完全不同的方式来实现我想做的事情,或者这只是我的一个愚蠢的想法。无论如何,我真的很感激一些指点,也许其他人已经做过这样的事情。谢谢!