在Lucene中结合模糊和SpanNear查询

时间:2015-02-18 15:33:53

标签: java lucene fuzzy-search

我通过模糊查询在输入字符串/文档中模糊搜索 Lucene 中的名字和姓氏(每个levenshtein距离为2)。

我进一步期望通过使用 SpanNearQuery 将这两个术语彼此接近(在此示例中,最多由3个术语分隔)。我也不想让秩序重要。

我构建查询的代码:

FuzzyQuery firstNameQuery = new FuzzyQuery(new Term("text", firstName), 2);
FuzzyQuery lastNameQuery = new FuzzyQuery(new Term("text", lastName), 2);

SpanQuery[] clauses = new SpanQuery[] {
    new SpanMultiTermQueryWrapper<MultiTermQuery>(firstNameQuery),
    new SpanMultiTermQueryWrapper<MultiTermQuery>(lastNameQuery)
};
SpanNearQuery spanNearQuery = new SpanNearQuery(clauses, 3, false);

我在单元测试中看到的是,levenshstein距离1的条款似乎有用,所以&#34; John Doa&#34;,&#34; Jon Dox&#34;等将匹配& #34; John Doe&#34;,但levenshstein距离2不会,例如&#34; Johnnie Doe&#34;不会匹配。

跨度长度工作正常,我可以在名字/姓氏之间最多使用3个术语。

有人可以告诉我我做错了什么吗?

更新1

对不起,我搞砸了我在这里设计的例子,出于隐私原因没有使用真实数据。

我所看到的是,查询并不像我想象的那样完成。

输入字符串:&#34;患者:John Doe&#34; 查询:spanNear([SpanMultiTermQueryWrapper(text:John~2),SpanMultiTermQueryWrapper(text:Doe~2)],3,false)

这不会产生命中,即使这些术语应完全匹配(编辑距离为0)。

1 个答案:

答案 0 :(得分:1)

Lucene 4.x模糊将在每个术语的编辑距离为2或更少时匹配,并且您的用例每个术语的距离大于2(John和Johnnie距离为3)。

在我看来,它不太建议使用Lucene内置模糊进行名称匹配,因为它不适用于冗长的名称(因为它的每个术语的<2距离)而且它的速度较慢,因为它使用有限状态来寻找最佳名称可能的比赛。

最好和最快的方法是使用&#34; n-gram&#34;模糊匹配的方法(三元模糊匹配很常见!)

更新: 看起来你可能有大写小写的问题,在我的理解中lucene丢弃查询分析器进行模糊搜索。

你可以试试&#34; john&#34;和&#34; doe&#34; (均为小写)作为您的名字和姓氏,让我知道它是否有效。