在我的应用程序中,我有一个公司,名称字段为This is a test
,由Lucene.Net正确索引。作为参考,我的MultiFieldQueryParser
将其默认运算符设置为QueryParser.Operator.AND
。
当我搜索this test~
和this tst~
时,我的搜索过去了。但是,当我尝试搜索this~ test~
,thas~ test~
,thas test~
和其他变体时,我的搜索失败。
这个目的是让用户拼错他们的搜索,所以如果用户搜索Jon Doe
,它仍然会显示John Doe
的结果,让用户不记得确切的拼写错误他们进入了数据库。不幸的是,它似乎只允许对搜索短语中的最后一个项进行模糊搜索。我做错了什么,或者我是否需要使用一个完整的独立分析器才能做到这一点?
答案 0 :(得分:5)
我最近不得不在我的项目上实现类似的东西。
我最终将短语分成多个片段并手动构建查询。
var input = "This is a test";
var fieldName = "yourField";
var minimumSimilarity = 0.5f;
var prefixLength = 3;
var query = new BooleanQuery();
var segments = input.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries);
foreach (var segment in segments)
{
var term = new Term(fieldName, segment);
var fuzzyQuery = new FuzzyQuery(term, minimumSimilarity, prefixLength);
query.Add(fuzzyQuery, BooleanClause.Occur.SHOULD);
}
我知道,非常原始,但似乎有效。
注意:这只是针对Lucene.net v2.3.1.3进行了测试