Search 将多个查询与Lucene.net(版本2.9)的布尔查询组合时出现问题
当我将多个查询与Search 将多个查询与Lucene.net(版本2.9)的布尔查询组合时出现问题,search,lucene.net,lucene,Search,Lucene.net,Lucene,当我将多个查询与Lucene.net(版本2.9)的布尔查询相结合时,我遇到了问题 请参阅我索引的文档结构 ID Make Model Price MakeDate CreatedBy 1 Ford Fiesta 240000 06/23/2011 anil 2 Ford Focus 250000 06/20/2011 anil 3 Vauxhall Astra 200000 06/21/2011
Lucene.net
(版本2.9)的布尔查询相结合时,我遇到了问题
请参阅我索引的文档结构
ID Make Model Price MakeDate CreatedBy
1 Ford Fiesta 240000 06/23/2011 anil
2 Ford Focus 250000 06/20/2011 anil
3 Vauxhall Astra 200000 06/21/2011 anil
4 Ford Focus LX 230000 06/21/2011 anilkumar
5 Ford Focus XI 260000 06/20/2011 anil
我的目的是获取在ie Model或Make的任何字段中包含焦点的记录,。。字段和CreatedBy
等于Anil
为此,我编写了以下查询
WildcardQuery query4 = new WildcardQuery(new Term("Make", "*focus*"));
WildcardQuery query5 = new WildcardQuery(new Term("Model", "*focus*"));
var queryParser3 = new QueryParser(Version.LUCENE_29, "CreatedBy", analyzer1);
var query3 = queryParser3.Parse("anil");
objBool.Add(query3, BooleanClause.Occur.MUST);
objBool.Add(query4, BooleanClause.Occur.SHOULD);
objBool.Add(query5, BooleanClause.Occur.SHOULD);
当我执行此操作时,实际上我只需要获得两条记录,即第2条和第5条。但我有四张唱片(不是第四张)
据我所知,它返回所有由创建的记录,这些记录等于Anil
请告诉我如何获得所需的结果以及需要做哪些更改。queryParser.Parse(“+Model:focus+CreatedBy:anil”)您需要嵌套您的查询,如果您使用带有括号的伪代码编写语句,则更有意义,您实际要做的是:
CreatedBy=='anil' AND (make~='*focus*' OR mode~='*focus*')
您需要在代码中添加一个附加步骤,将2个应该查询嵌套在一个必须查询中
例如:
将成为:
objBool.Add(query3, BooleanClause.Occur.MUST);
BooleanQuery nested = new BooleanQuery();
nested.Add(query4, BooleanClause.Occur.SHOULD);
nested.Add(query5, BooleanClause.Occur.SHOULD);
objBool.Add(nested, BooleanClause.Occur.MUST);
另一个要考虑的问题是Lucene不是一个数据库,创建一个名为MakimoDel[/Cord]的专栏是完全有效的。当你对包含Sube和Mead的内容进行索引时,这将使查询更加简单快捷。使用Lucene构造索引与构造查询同样重要,如果不是更重要的话。
当我们严格检查Model field和CreatedBy时,这将起作用。但我想为Model和Make字段应用contains,并等于CreatedBy字段。就像(Model='focus'或Make='focus')和CreatedBy='Anil'。谢谢您的回答。是的,它对我很有用,并且我知道如何在多个字段上使用多个条件。再次感谢…对于无分搜索,没有理由在同一个布尔查询中使用MUST和SHOULD子句。如果一个文档必须包含“cat”,并且应该包含“dog”,那么SHOULD子句是多余的,因为无论文档是否包含“dog”,您都只会得到带有“cat”的所有文档。但是,如果我们的查询确实进行了评分,那么如果我们增强了SHOULD子句,我们可能会在SHOULD子句中包含一个SHOULD子句和一个MUST子句。所以我们可以搜索所有必须有“cat”的文档,但同时也有“dog”的文档。
objBool.Add(query3, BooleanClause.Occur.MUST);
BooleanQuery nested = new BooleanQuery();
nested.Add(query4, BooleanClause.Occur.SHOULD);
nested.Add(query5, BooleanClause.Occur.SHOULD);
objBool.Add(nested, BooleanClause.Occur.MUST);