简单问题描述:
Lucene索引每个文档有两个字段:ID和NAME。
我想使用Lucene Query接口进行查询,这样我就可以找到ID为1或2或3等所有文档。要搜索的ID将位于列表中,最多可能包含30个元素。
如果我使用查询解析器,我会做类似的事情
ID:(1 OR 2 OR 3)
但是应用程序已经大量提交到Query接口,我想要遵循当前的模式。我只能想到使用Query接口执行此操作是创建n个术语查询并使用下面的布尔查询对它们进行分组
BooleanQuery booleanQuery = new BooleanQuery();
(String searchId : lstIds)
{
booleanQuery.add(new TermQuery(new Term("ID", searchId)), BooleanClause.Occur.SHOULD);
}
但有没有更好/更有效的方法呢?
答案 0 :(得分:6)
将查询与BooleanQuery
组合在一起是重现ID:(1 OR 2 OR 3)
之类的查询的正确方法。查询解析器将生成一个类似于您为该语法提供的BooleanQuery,因此您绝对在这里做正确的事。
您可以使用PrefixQuery
,NumericRangeQuery
或TermRangeQuery
来简化问题,如果它们在实践中真正符合您的需求,但您的身份没有任何问题已经做好了。
答案 1 :(得分:0)
BooleanQuery
是用于处理 OR 运算符的解决方案,但是如果您想要它的简单替代方案,则也可以使用简单的Query
并通过 ID 作为“ 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);
或,如果您具有所有的 OR ,则也可以使用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);
我希望为您工作。