1

我在使用 Lucene.NET 3.0.3 时遇到以下问题。

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

我的代码如下所示:

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”一词在我的停用词列表中。

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

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

4

1 回答 1

3

不分析通配符查询(例如,请参阅此问题)。由于您(如果我理解正确的话)将查询解释"Test- und Produktivumgebung"(+*Test* +*und* +*Produktivumgebung*),因此分析器不会用于任何通配符查询,并且不会消除停用词。

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

于 2013-11-12T16:28:55.907 回答