通过使用模糊查询,我在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);我现在在单元测试中看到的是,莱文施斯坦距离1的术语似乎有效,所以"John Doa“、"Jon Dox”等将与"John Doe“匹配,而levenshstein距离2则不适用。“约翰尼·多伊”不匹配。
跨度很好,我在名字和姓氏之间最多可以有3个术语。
有人能告诉我我做错了什么吗?
更新1
对不起,我搞砸了我在这里设计的例子,出于隐私原因,我没有使用真实的数据。
我看到的是,这个查询并不像我想象的那样起作用。
输入字符串:“病人: John”查询: spanNear(SpanMultiTermQueryWrapper(text:John~2),SpanMultiTermQueryWrapper(文本:Doe~2),3,false)
这不会产生命中,即使这些术语应该完全匹配(编辑距离为0)。
发布于 2015-02-19 06:37:13
Lucene 4.x模糊将匹配编辑距离2或更短的每项,您的用例的距离大于2每项(John和Johnnie是距离3)。
在我看来,它不太建议使用Lucene内置的模糊名称匹配,因为它不会正确地工作对冗长的名称(作为其每项的<2距离)和它的慢,因为它使用有限状态寻找最佳可能的匹配。
最好和最快的方法是使用"n-gram“方法进行模糊匹配(trigram模糊匹配是常见的!)
更新:看起来你可能对大写小写有问题,在我的理解中,lucene抛弃了用于模糊搜索的查询分析器。
你能试着用"john“和"doe”(两者都是小写字母)作为你的名字和姓氏,然后告诉我它是否有效。
https://stackoverflow.com/questions/28587401
复制相似问题