首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Lucene查询接口搜索值列表

如何使用Lucene查询接口搜索值列表
EN

Stack Overflow用户
提问于 2013-12-10 11:13:11
回答 2查看 11.1K关注 0票数 3

简单化的问题描述:

Lucene索引每个文档有两个字段: ID和NAME。

我想使用Lucene查询接口进行查询,这样我就可以找到ID为1、2或3的所有文档,依此类推。要搜索的ID将在一个列表中,并且可能包含多达30个元素。

如果我使用查询解析器,我会这样做

代码语言:javascript
复制
ID:(1 OR 2 OR 3)

但是应用程序已经大量提交给查询接口,我想遵循当前的模式。对于查询接口,我能想到的唯一方法就是创建n个术语查询,并使用布尔查询对它们进行分组,如下所示

代码语言:javascript
复制
BooleanQuery booleanQuery = new BooleanQuery();
(String searchId : lstIds)
{
    booleanQuery.add(new TermQuery(new Term("ID", searchId)), BooleanClause.Occur.SHOULD);
}

但是,有没有更好/更有效的方法来做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-11 00:39:34

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

你也许能够利用PrefixQueryNumericRangeQueryTermRangeQuery来简化问题,如果它们在实践中确实适合你的需要,但你已经在做的事情没有错。

票数 8
EN

Stack Overflow用户

发布于 2018-09-26 19:48:29

BooleanQuery是处理OR运算符的解决方案,如您在代码中所示,但如果您希望使用简单的替代方案,您也可以使用简单的Query,并将 in 作为"1 OR 2 OR 3"进行传递。

以下是lucene 7的代码片段。

代码语言:javascript
复制
Query query = new QueryParser("ID", analyzer).parse("1 OR 2 OR 3");
TopDocs topDocs = searcher.search(query, 10);

或者,如果你有所有的,你也可以使用QueryParser缺省运算符。

以下是lucene 7的代码片段。

代码语言:javascript
复制
QueryParser queryParser = new QueryParser("ID", analyzer);
queryParser.setDefaultOperator(QueryParser.Operator.OR);
Query query = queryParser.parse("1 2 3");
TopDocs topDocs = searcher.search(query, 10);

我希望这对你有用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20485320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档