当我将多个查询与Lucene.net的布尔查询(版本2.9)组合时出现问题

时间:2011-06-23 04:12:00

标签: 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  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的所有记录。

请建议我如何获得所需的结果以及需要做些哪些更改。

2 个答案:

答案 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”)