2010-09-14 12 views

Antwort

5

Wenn Sie den Datentyp in Ihrem Feld kennen, können Sie eine Bereichsabfrage versuchen. Wenn Ihr Feld beispielsweise Zeichenfolgedaten enthält, gibt eine Abfrage wie field:[a* TO z*] alle Dokumente zurück, bei denen in diesem Feld ein Zeichenfolgenwert vorhanden ist.

+0

Diese funktionieren sollte. Es wäre etwas komplexer, wenn das Feld Werte hat, die mit Zahlen oder Großbuchstaben beginnen. Sollte mit einer OR-Abfrage einfach zu tun sein. –

+0

Guter Punkt! Wenn es jedoch mit einem Großbuchstaben beginnt, sollte ein Bereich, der mit einem * beginnt, es fangen, da das Javadoc von TermRangeQuery angibt, dass es String.CompareTo verwendet, um festzustellen, ob ein String Teil des Bereichs ist. –

+0

Das sieht gut aus. Ich bin mir nicht sicher, ob ich Aufzeichnungen fangen soll, die mit Zahlen beginnen, aber das ist ein guter Anfang. Vielen Dank! –

3

Ich habe etwas Experimentieren getan, und es scheint der einfachste Weg, dies zu erreichen, ist eine QueryParser zu erstellen und SetAllowLeadingWildcard(true) rufen und die Suche nach field:* wie so:

var qp = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, field, analyzer); 
qp.SetAllowLeadingWildcard(true); 
var query = qp.Parse("*")); 

(Anmerkung ich die Standard-Einstellung bin Feld der QueryParser zu field in seinem Konstruktor, daher die Suche nach nur "*" in Parse()).

Ich kann nicht verbürgen, wie effizient diese Methode gegenüber anderen Methoden, aber die einfachste Methode ist, die ich finden kann, würde ich erwarten, dass es zumindest so effizient wie field:[* TO *] sein, und es vermeidet wie field:[0* TO z*] hackish Dinge zu tun hat , die möglicherweise nicht alle möglichen Werte berücksichtigt, z. B. Werte, die mit nicht alphanumerischen Zeichen beginnen.

1

Eine andere Lösung wird unter Verwendung eines ConstantScoreQuery mit einem FieldValueFilter

new ConstantScoreQuery(new FieldValueFilter("field")) 
Verwandte Themen