6

我正在使用 Solr 进行模糊查询,它遍历可能拼写错误的单词或缩写词的数据存储库。例如,存储库的名称可能带有“Hlth”(单词“Health”的缩写形式)。

  1. 如果我进行模糊搜索,Name:'Health'~0.35 我会得到带有单词“Health”而不是“Hlth”的结果。
  2. 如果我进行模糊搜索,Name:'Hlth'~0.35我会得到名称为“Health”和“Hlth”的记录。

我想让第一个查询工作。在我的业务用例中,我必须使用干净的数据来查询所有拼写错误或缩写的单词。

有人可以帮忙解释一下为什么#1模糊搜索不起作用,以及是否有任何其他方法可以实现相同的目标。

4

3 回答 3

8

您以错误的方式使用模糊查询。

根据 Mike McCandless 所说的(http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.html):

FuzzyQuery 将术语“接近”到指定的基本术语匹配:您指定允许的最大编辑距离,并且与基本术语(以及包含这些术语的文档)在该编辑距离内的任何术语都匹配。

QueryParser 语法是 term~ 或 term~N,其中 N 是允许的最大编辑次数(对于旧版本,N 是介于 0.0 和 1.0 之间的令人困惑的浮点数,通过一个棘手的公式转换为等效的最大编辑距离)。

FuzzyQuery 非常适合匹配专有名称:我可以搜索 mcandless~1,它将匹配 mccandless(插入 c)、mcandles(删除 s)、mkandless(将 c 替换为 k)和许多其他“接近”术语。使用最大编辑距离 2,您最多可以进行 2 次插入、删除或替换。每场比赛的得分基于该词条的编辑距离;所以精确匹配得分最高;编辑距离1,更低;等等

所以你需要写这样的查询 - Health~2

于 2014-06-04T18:47:45.943 回答
3

您写道:“我想将 Parkway 与 Pkwy 相匹配”

Parkway 和 Pkwy 的编辑距离为 3。您可以通过从第一个响应中将“~3”替换为“~2”来实现此目的,但出于性能原因,对于大于 2 的值不建议使用 Solr 模糊匹配。

我认为解决您的问题的最佳方法是生成特定于上下文的同义词词典并进行查询时间扩展。

于 2015-06-17T01:49:36.207 回答
0

使用语音过滤器可能会解决您的问题。

请考虑查看以下
https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions#FilterDescriptions-PhoneticFilter

https://cwiki.apache.org/confluence/display/solr/Phonetic+Matching

希望这可以帮助。

于 2016-07-15T08:02:26.787 回答