为什么我的Lucene.net搜索在搜索查询中对多个单词执行模糊搜索时失败?
在我的应用程序中,我有一个公司,其名称字段是一个测试,它被Lucene.Net正确地索引。作为参考,我的MultiFieldQueryParser的默认运算符设置为QueryParser.operator.AND 搜索此测试~和此tst~时,我的搜索通过。但是,当我尝试搜索此~test~、thas~test~、thas test~和其他变体时,搜索失败为什么我的Lucene.net搜索在搜索查询中对多个单词执行模糊搜索时失败?,lucene,lucene.net,fuzzy-search,Lucene,Lucene.net,Fuzzy Search,在我的应用程序中,我有一个公司,其名称字段是一个测试,它被Lucene.Net正确地索引。作为参考,我的MultiFieldQueryParser的默认运算符设置为QueryParser.operator.AND 搜索此测试~和此tst~时,我的搜索通过。但是,当我尝试搜索此~test~、thas~test~、thas test~和其他变体时,搜索失败 这样做的全部目的是允许用户将他们的搜索拼错一点,因此,如果用户搜索Jon Doe,它仍然会显示John Doe的结果,使用户无法记住他们在数据库
这样做的全部目的是允许用户将他们的搜索拼错一点,因此,如果用户搜索Jon Doe,它仍然会显示John Doe的结果,使用户无法记住他们在数据库中输入的内容的确切拼写。不幸的是,它似乎只允许对搜索短语中的最后一个词进行模糊搜索。我是做错了什么,还是需要使用一个单独的分析器才能做到这一点?我最近不得不在我的项目中实现类似的功能 最后,我将短语分成多个部分,并手动构造查询
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进行了测试,我最近不得不在我的项目上实现类似的东西 最后,我将短语分成多个部分,并手动构造查询
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进行了测试。注意:如果在索引时使用WhitespaceAnalyzer,则效果最佳,许多其他分析器会降低数据的大小写,因此对此的搜索不会匹配任何内容。在我的情况下,不要求搜索区分大小写,因此,我使用StandardAnalyzer.TokenStreamstring字段名,TextReader Reader生成搜索词。对于Java,它将是query.addnew BooleanClausefuzzyQuery,发生。应该在最后一行注意:如果您在索引时使用WhitespaceAnalyzer,这将最有效,许多其他分析器将降低数据的大小写,因此,对此的搜索不会匹配任何内容。在我的情况下,搜索不需要区分大小写,因此我使用StandardAnalyzer.TokenStreamstring fieldName,TextReader Reader生成搜索词。对于Java,它将是query.addnew BooleanClausefuzzyQuery,Occurse