java - 如何让 Lucene 中的 QueryParser 处理数字范围?

标签 java lucene

new QueryParser(.... ).parse (somequery);

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

new QueryParser(....).parse("count:[1 TO 10]");

上面那个不行。相反,如果我使用正在工作的 "NumericRangeQuery.newIntRange"。但是,我只需要上面的...

最佳答案

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

要创建一个自定义查询解析器,它将解析以下查询“INTFIELD_NAME:1203”或“INTFIELD_NAME:[1 TO 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);

}
}

我从 http://www.mail-archive.com/search?l=java-user@lucene.apache.org&q=subject:%22Re%3A+How+do+you+properly+use+NumericField%22&o=newest&f=1 中获取了该线程中引用的代码并做了 3 处修改:

  • 更好地重写了 newRangeQuery

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

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

当我第一次在同一个数字字段的过滤器中使用此方法时,我将 0 设置为 0,因为我发现它是 lucene 类中的默认值并且它起作用了。

  • 替换为 newTermQuery

    TermQuery tq = new TermQuery(new Term(field,

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

使用“字段”是错误的,因为如果您的查询有多个子句 (FIELD:text OR INTFIELD:100),它将采用第一个或前一个子句字段。

关于java - 如何让 Lucene 中的 QueryParser 处理数字范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5026185/

相关文章:

java - GWT 编辑器 - 使用子编辑器编辑 subdto

java - Spring 应用程序在 8 小时后失去与 MySql 的连接。如何正确配置?

java - EL表达式解析整型为long

Lucene 排名——如何使用新的 4.0 评分模型

java - lucene 实现相关性的自定义评分

java - 如何获取lucene设置的内部文档id

java - 虚拟实现设计模式名称

java - 如何从递归方法返回 boolean 值?

java - 无法为对象堆保留足够的空间

java - Lucene 5.2.1 中的更改分数