Hmericnate Search中的int字段的NumericRangeQuery失败

时间:2016-06-09 15:55:09

标签: hibernate hibernate-search

我定义了一个字段如下:

@Column(name = "clip_segments")
@Field(store = Store.YES)
public long getClipSegments() {
    return clipSegments;
}

我想在搜索对象时使用NumericRangeQuery(返回字段值> 0的所有对象):

org.apache.lucene.search.Query onlyCompilableQuery = NumericRangeQuery
                .newIntRange("clipSegments", 0, Integer.MAX_VALUE, false,
                        false);

然而,这总是失败,即没有返回结果。我用Luke检查了索引,我可以看到这些字段被注释为数字,它们有不同的值。

我尝试了几种方法,但总是得到相同的结果。最终,我决定使用IntegerBridge:

@Column(name = "clip_segments")
@Field(store = Store.YES)
@FieldBridge(impl = IntegerBridge.class)
public long getClipSegments() {
    return clipSegments;
}

在字段上使用简单的关键字搜索:

org.apache.lucene.search.Query onlyCompilableQuery = qb.keyword()
                .onFields("clipSegments").matching("0")
                .createQuery();

如果我在查询中使用.not()执行BooleanJunction以获取字符串字段不同于“0”的所有对象,则此方法有效。

我不明白我在NumericField上做错了什么。任何帮助表示赞赏。

另外,使用NumericRangeQuery会更好吗?

1 个答案:

答案 0 :(得分:2)

我并不感到惊讶,整数和长期在Lucene指数中的编码方式不同。

尝试使用NumericRangeQuery.newLongRange而不是newIntRange。

话虽这么说,你应该使用能够为你完成工作的DSL并避免这些错误。有关示例,请参阅http://docs.jboss.org/hibernate/search/5.5/reference/en-US/html_single/#_range_queries

你有一个下面的例子(),在你的情况下,你应该只使用上面的(0l)。