Lucene在StandardAnalyzer中使用StopWords进行搜索

时间:2013-11-12 14:31:40

标签: lucene lucene.net analyzer stop-words standardanalyzer

使用Lucene.NET 3.0.3我有以下问题。

我的项目使用带有StopWord-List的StandardAnalyzer分析文档(结合德语和英语单词) 在搜索时,我手动创建我的searchterm并使用MultiFieldQueryParser解析它。解析器使用与索引文档相同的分析器进行初始化 解析的搜索查询初始化了一个BooleanQuery。使用IndexSearcher在Lucene索引中搜索BooleanQuery和TopScoreDocCollector。

我的代码如下:

using (StandardAnalyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30, roxConnectionTools.getServiceInstance<ISearchIndexService>().GetStopWordList()))
{
    ...
    MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_30, searchFields, analyzer);
    parser.MultiTermRewriteMethod = MultiTermQuery.SCORING_BOOLEAN_QUERY_REWRITE;
    parser.AllowLeadingWildcard = true;
    ...
    Query searchQuery = parser.Parse(searchStringBuilder.ToString().Trim);
    ...
    BooleanQuery boolQuery = new BooleanQuery();
    boolQuery.Add(searchQuery, Occur.MUST);
    ...
    TopScoreDocCollector scoreCollector = TopScoreDocCollector.Create(SearchServiceTools.MAX_SCORE_COLLECTOR_SIZE, true);
    ...
    searcher.Search(boolQuery, scoreCollector);
    ScoreDoc[] scoreDocs = scoreCollector.TopDocs().ScoreDocs;
}

如果我使用值“Test- und Produktivumgebung”索引文档字段,则无法通过搜索此术语找到此文档。
如果我将搜索词更正为“Test- Produktivumgebung”,我会得到结果 “und”这个词出现在我的StopWord-List中。

我的搜索查询如下所示:
    手动生成的搜索查询: (+ * Test * + * und * + * Produktivumgebung *)
    解析的搜索查询: +(title:* Test *)+(title:* und *)+(title:* Produktivumgebung *)

为什么我找不到搜索“Test- und Produktivumgebung”的文件?

1 个答案:

答案 0 :(得分:4)

未分析通配符查询(有关示例,请参阅this question)。由于您(如果我理解正确),将查询"Test- und Produktivumgebung"解释为(+*Test* +*und* +*Produktivumgebung*),分析器不会用于任何通配符查询,并且不会消除停用词。

如果您取消执行该转换的步骤,则应将查询"Test- und Produktivumgebung"解析为短语查询并进行分析,并且应该可以正常工作。消除这一步骤的另一个原因是,对每个术语应用前导通配符将导致您的性能变得非常差。这就是必须手动启用前导通配符的原因,因为使用它们通常是一个坏主意。