我得到以下代码:
Lucene.Net.Analysis.Analyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
var mainQuery = new Lucene.Net.Search.BooleanQuery();
foreach (var str in fields)
{
var parser = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, str, analyzer);
mainQuery.Add(parser.Parse(search +"*"), Lucene.Net.Search.BooleanClause.Occur.SHOULD);
}
Lucene.Net.Search.TopScoreDocCollector collector = Lucene.Net.Search.TopScoreDocCollector.create(21, true);
searcher.Search(mainQuery, collector);
hits = collector.TopDocs().scoreDocs;
生活很好。直到我注意到,我得到的结果也是NotActive
。所以我对自己说,好的,没问题,让我们在 for 循环之后向 mainQuery 添加另一个查询,如下所示:
var parser2 = new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_29, "StateProperties.IsActive", analyzer);
mainQuery.Add(parser2.Parse("True"), Lucene.Net.Search.BooleanClause.Occur.MUST);
不幸的是,这不起作用。任何人都可以指出我这样做的正确方向吗?我已经阅读了有关过滤器的信息,甚至设法应用了一个,但后来我失去了分数(好吧,并不是真的输了,但它们与原始查询相差甚远)。我也读过TermQueryWrapper
,但找不到如何实现它(所以我不知道这是否是我需要的,即使它似乎是正确的方向)。
编辑:我忘了提,中的所有字段fields
都已分析,StateProperties.IsActive
即NOT_ANALYZED
.