如何使Lucene中的QueryParser处理数值范围?

Nag*_*ran 6 java lucene

new QueryParser(.... ).parse (somequery);
Run Code Online (Sandbox Code Playgroud)

它仅适用于字符串索引字段.假设我有一个名为count的字段,其中count是一个整数字段(同时索引我认为是数据类型的字段)

new QueryParser(....).parse("count:[1 TO 10]");
Run Code Online (Sandbox Code Playgroud)

以上一个不起作用.相反,如果我使用"NumericRangeQuery.newIntRange",它正在工作.但是,我只需要上面的......

Jer*_*mie 5

有同样的问题并解决了,所以在这里我分享我的解决方案:

要创建一个自定义查询解析器,它将解析以下查询"INTFIELD_NAME:1203"或"INTFIELD_NAME:[1到10]"并将字段INTFIELD_NAME作为Intfield处理,我使用以下内容覆盖newTermQuery:

public class CustomQueryParser extends QueryParser {

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

protected Query newRangeQuery(String field, String part1, String part2, boolean startInclusive,
    boolean endInclusive) {

    if (INTFIELD_NAME.equals(field)) {
    return NumericRangeQuery.newIntRange(field, Integer.parseInt(part1), Integer.parseInt(part2),
        startInclusive, endInclusive);
    }
    return (TermRangeQuery) super.newRangeQuery(field, part1, part2, startInclusive, endInclusive);
}


protected Query newTermQuery(Term term) {
    if (INTFIELD_NAME.equals(term.field())) {

    BytesRefBuilder byteRefBuilder = new BytesRefBuilder();
    NumericUtils.intToPrefixCoded(Integer.parseInt(term.text()), 0, byteRefBuilder);
    TermQuery tq = new TermQuery(new Term(term.field(), byteRefBuilder.get()));

    return tq;
    } 
    return super.newTermQuery(term);

}
}
Run Code Online (Sandbox Code Playgroud)

我从http://www.mail-archive.com/search?l=java-user@lucene.apache.org&q=subject:%22Re%3A+How+do+you+properly+获取该主题中引用的代码使用+ NumericField%22&o =最新&f = 1并进行了3次修改:

  • 重新编写newRangeQuery更好一点

  • 在newTermQuery方法中替换 NumericUtils.intToPrefixCoded(Integer.parseInt(term.text()),NumericUtils.PRECISION_STEP_DEFAULT)));

    通过 NumericUtils.intToPrefixCoded(Integer.parseInt(term.text()), 0, byteRefBuilder);

当我第一次在同一个数字字段的过滤器中使用这个方法时,我把0放在lucene类中我发现它是一个默认值,它只是工作.

  • 替换为newTermQuery

    TermQuery tq = new TermQuery(new Term(field,

通过 TermQuery tq = new TermQuery(new Term(term.field(),

使用"field"是错误的,因为如果你的查询有几个子句(FIELD:text OR INTFIELD:100),它将取第一个或前一个子句字段.


chi*_*iku 1

QueryParser 不会创建 NumericRangeQuery,因为它无法知道字段是否使用 NumericField 进行索引。只需扩展 QueryParser 即可处理这种情况。