Hibernate Search 中的 int 字段的 NumericRangeQuery 失败

NumericRangeQuery fails for int field in Hibernate Search

我定义了一个字段如下:

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

我想在搜索对象(return 字段值 > 0 的所有对象)时对其应用 NumericRangeQuery:

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

然而,这总是失败,即没有结果 returned。我和 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 的性能是否更好?

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

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

也就是说,您应该使用 DSL,它会为您完成工作并避免这些错误。有关示例,请参阅 http://docs.jboss.org/hibernate/search/5.5/reference/en-US/html_single/#_range_queries

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