2016-06-09 72 views
0

我定义的字段,如下所示:NumericRangeQuery未能在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(); 

和()这个作品,如果我做了BooleanJunction用。不上查询获取字符串字段与“0”不同的所有对象。

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

另外,使用NumericRangeQuery的性能会更好吗?

回答

2

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

尝试用NumericRangeQuery.newLongRange代替newIntRange。

这就是说,你应该使用DSL将为你做的工作,并避免这些错误。有关示例,请参见http://docs.jboss.org/hibernate/search/5.5/reference/en-US/html_single/#_range_queries

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

+0

是的,很显然,你是正确的长/整数正面。我在NumericRangeQuery之前尝试了'above(0)',但它也没有返回结果,因为完全相同的原因。做到这一点的方法是用'above(new Long(0))'或'above(0L)'来确保它是一个Long not一个整数。 – PawelPredki

+0

这就是我写的,只是一个小写的l;) –

+0

我是盲人,对不起:)它融化在我眼中的圆括号中... – PawelPredki