2016-06-09 6 views
0

ich ein Feld wie folgt definiert:NumericRangeQuery nicht für int Feld in Hibernate Search

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

Und ich wollte ein NumericRangeQuery es, anzuwenden, wenn für Objekte sucht (Rückkehr alle Objekte mit dem Feldwert> 0) :

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

dies ist jedoch immer versagt, dh es werden keine Ergebnisse zurückgegeben werden. Ich habe den Index mit Luke untersucht und kann sehen, dass die Felder numerisch kommentiert sind und unterschiedliche Werte haben.

Ich versuchte mehrere Möglichkeiten, aber immer mit den gleichen Ergebnissen. Letztlich entschied ich die IntegerBridge zu verwenden:

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

Und eine einfache Stichwortsuche auf dem Feld verwenden:

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

Und das funktioniert, wenn ich einen BooleanJunction mit .not() auf der Abfrage zu tun Holen Sie alle Objekte mit dem Zeichenfolgenfeld anders als "0".

Ich verstehe nicht, was ich falsch mit dem NumericField mache. Jede Hilfe wird geschätzt.

Auch, ist die Leistung viel besser mit der NumericRangeQuery?

Antwort

2

Ich bin nicht wirklich überrascht, Integers und Longs sind unterschiedlich im Lucene-Index codiert.

Versuchen Sie mit NumericRangeQuery.newLongRange anstelle von newIntRange.

Das gesagt, sollten Sie die DSL verwenden, die die Arbeit für Sie erledigen wird und diese Fehler vermeiden. Einige Beispiele finden Sie unter http://docs.jboss.org/hibernate/search/5.5/reference/en-US/html_single/#_range_queries.

Sie haben ein Beispiel mit unten(), in Ihrem Fall sollten Sie nur über (0l) verwenden.

+0

Ja, offensichtlich sind Sie direkt auf der Long/Integer Front. Ich habe 'über (0)' vor NumericRangeQuery versucht, aber es gab auch nicht die Ergebnisse sind aus genau dem gleichen Grund gesucht. Der Weg dazu ist mit "über (neu lang (0))" oder "über (0L)", um sicherzustellen, dass es ein Long ist, kein Integer. – PawelPredki

+0

Das ist was ich geschrieben habe, nur mit einem Kleinbuchstaben l;) –

+0

Ich bin blind, Entschuldigung :) Es schmolz mit den Klammern in meinen Augen ... – PawelPredki

Verwandte Themen