Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 将多个查询与Lucene.net(版本2.9)的布尔查询组合时出现问题_Search_Lucene.net_Lucene - Fatal编程技术网

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);