为什么我的Lucene.net搜索在搜索查询中对多个单词执行模糊搜索时失败?

为什么我的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的结果,使用户无法记住他们在数据库

在我的应用程序中,我有一个公司,其名称字段是一个测试,它被Lucene.Net正确地索引。作为参考,我的MultiFieldQueryParser的默认运算符设置为QueryParser.operator.AND

搜索此测试~和此tst~时,我的搜索通过。但是,当我尝试搜索此~test~、thas~test~、thas test~和其他变体时,搜索失败


这样做的全部目的是允许用户将他们的搜索拼错一点,因此,如果用户搜索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