使用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”的文件?
答案 0 :(得分:4)
未分析通配符查询(有关示例,请参阅this question)。由于您(如果我理解正确),将查询"Test- und Produktivumgebung"
解释为(+*Test* +*und* +*Produktivumgebung*)
,分析器不会用于任何通配符查询,并且不会消除停用词。
如果您取消执行该转换的步骤,则应将查询"Test- und Produktivumgebung"
解析为短语查询并进行分析,并且应该可以正常工作。消除这一步骤的另一个原因是,对每个术语应用前导通配符将导致您的性能变得非常差。这就是必须手动启用前导通配符的原因,因为使用它们通常是一个坏主意。