首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lucene中数值范围查询与术语查询的结合

Lucene中数值范围查询与术语查询的结合
EN

Stack Overflow用户
提问于 2010-07-15 07:06:40
回答 4查看 11.2K关注 0票数 12

我想在Lucene中组合一个数值范围查询和一个术语查询。例如,我想搜索我索引的文档,这些文档包含10到20页,标题为"Hello World“。

似乎不可能使用QueryParser为我生成这个查询;QueryParser生成的范围查询似乎是一个文本查询。

我非常希望能举一个例子,说明如何将数值范围查询与术语查询结合起来。我也是开放的,除了搜索我的索引之外,我还会选择其他的。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-15 21:38:49

看起来这是我自己想出来的。您可以一起使用Query.combine()对查询进行OR操作。我在下面给出了一个例子。

代码语言:javascript
复制
String termQueryString = "title:\"hello world\"";
Query termQuery = parser.parse(termQueryString);

Query pageQueryRange = NumericRangeQuery.newIntRange("page_count", 10, 20, true, true);

Query query = termQuery.combine(new Query[]{termQuery, pageQueryRange});
票数 11
EN

Stack Overflow用户

发布于 2012-01-25 11:14:55

您还可以创建一个自定义的QueryParser覆盖protected Query getRangeQuery(...)方法,该方法在遇到NumericRangeQuery字段时应返回"page_count"实例。

像这样..。

代码语言:javascript
复制
public class CustomQueryParser extends QueryParser {

    public CustomQueryParser(Version matchVersion, String f, Analyzer a) {
        super(matchVersion, f, a);
    }

    @Override
    protected Query getRangeQuery(final String field, final String part1, final String part2, final boolean inclusive) throws ParseException {

        if ("page_count".equals(field)) {
            return NumericRangeQuery.newIntRange(field, Integer.parseInt(part1), Integer.parseInt(part2), inclusive, inclusive);
        }

        // return default
        return super.getRangeQuery(field, part1, part2, inclusive);    
    }
}

然后在解析文本查询时使用CustomQueryParser

像这样..。

代码语言:javascript
复制
...
final QueryParser parser = new CustomQueryParser(Version.LUCENE_35, "some_default_field", new StandardAnalyzer(Version.LUCENE_35));
final Query q = parser.parse("title:\"hello world\" AND page_count:[10 TO 20]");
...

当然,这一切都假定在将page_count值添加到文档时使用了NumericField(...).setIntValue(...)

票数 5
EN

Stack Overflow用户

发布于 2014-08-23 14:26:55

您可以使用BooleanQuery

代码语言:javascript
复制
var combinedQuery = new BooleanQuery();
combinedQuery.Add(new TermQuery(new Term("title","hello world")),Occur.MUST);
combinedQuery.Add(NumericRangeQuery.newIntRange("page_count", 10, 20, true, true),Occur.MUST);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3251245

复制
相关文章

相似问题

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