简单化的问题描述:
Lucene索引每个文档有两个字段: ID和NAME。
我想使用Lucene查询接口进行查询,这样我就可以找到ID为1、2或3的所有文档,依此类推。要搜索的ID将在一个列表中,并且可能包含多达30个元素。
如果我使用查询解析器,我会这样做
ID:(1 OR 2 OR 3)但是应用程序已经大量提交给查询接口,我想遵循当前的模式。对于查询接口,我能想到的唯一方法就是创建n个术语查询,并使用布尔查询对它们进行分组,如下所示
BooleanQuery booleanQuery = new BooleanQuery();
(String searchId : lstIds)
{
booleanQuery.add(new TermQuery(new Term("ID", searchId)), BooleanClause.Occur.SHOULD);
}但是,有没有更好/更有效的方法来做到这一点呢?
发布于 2013-12-11 00:39:34
将查询与BooleanQuery组合在一起是重现像ID:(1 OR 2 OR 3)这样的查询的正确方法。查询解析器将生成一个类似于您为该语法提供的BooleanQuery,因此您在这里所做的绝对是正确的。
你也许能够利用PrefixQuery、NumericRangeQuery或TermRangeQuery来简化问题,如果它们在实践中确实适合你的需要,但你已经在做的事情没有错。
发布于 2018-09-26 19:48:29
BooleanQuery是处理OR运算符的解决方案,如您在代码中所示,但如果您希望使用简单的替代方案,您也可以使用简单的Query,并将 in 作为"1 OR 2 OR 3"进行传递。
以下是lucene 7的代码片段。
Query query = new QueryParser("ID", analyzer).parse("1 OR 2 OR 3");
TopDocs topDocs = searcher.search(query, 10);或者,如果你有所有的或,你也可以使用QueryParser缺省运算符。
以下是lucene 7的代码片段。
QueryParser queryParser = new QueryParser("ID", analyzer);
queryParser.setDefaultOperator(QueryParser.Operator.OR);
Query query = queryParser.parse("1 2 3");
TopDocs topDocs = searcher.search(query, 10);我希望这对你有用。
https://stackoverflow.com/questions/20485320
复制相似问题