如何使用Lucene Query界面搜索值列表

时间:2013-12-10 03:13:11

标签: search lucene full-text-search

简单问题描述:

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

但有没有更好/更有效的方法呢?

2 个答案:

答案 0 :(得分:6)

将查询与BooleanQuery组合在一起是重现ID:(1 OR 2 OR 3)之类的查询的正确方法。查询解析器将生成一个类似于您为该语法提供的BooleanQuery,因此您绝对在这里做正确的事。

您可以使用PrefixQueryNumericRangeQueryTermRangeQuery来简化问题,如果它们在实践中真正符合您的需求,但您的身份没有任何问题已经做好了。

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

我希望为您工作。