当我将多个查询与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
我的目的是在任何字段中获取包含focus
的记录,即模型或制作,..字段,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);
当我执行此操作时,实际上我只需要获得两个记录,即第二个和第五个。但是我得到了四个记录,即第四个记录。
根据我的理解,它会返回CreatedBy
等于Anil
的所有记录。
请建议我如何获得所需的结果以及需要做些哪些更改。
答案 0 :(得分:3)
你需要嵌套你的查询,如果你用伪代码用一些括号写你的语句更有意义,你实际上要做的是:
CreatedBy=='anil' AND (make~='*focus*' OR mode~='*focus*')
您需要在代码中执行的操作是添加一个额外的步骤,将2个SHOULD查询嵌套在MUST查询中。
例如:
objBool.Add(query3, BooleanClause.Occur.MUST);
objBool.Add(query4, BooleanClause.Occur.SHOULD);
objBool.Add(query5, BooleanClause.Occur.SHOULD);
会变成:
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不是一个数据库,当你索引包含make和model的内容时,创建一个名为MakeModel
的列是完全有效的,这将使得更简单和更快的查询。使用Lucene构建索引与构造查询同样重要,如果不是更重要的话。
答案 1 :(得分:0)
queryParser.Parse(“+ Model:focus + CreatedBy:anil”)