2016-06-09 73 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