Ich möchte alle Dokumente im Index finden, die ein bestimmtes Feld haben, unabhängig vom Wert des Feldes. Wenn möglich, verwenden Sie die Abfragesprache, nicht die API.Finden Sie alle Lucene Dokumente mit einem bestimmten Feld
Gibt es einen Weg?
Ich möchte alle Dokumente im Index finden, die ein bestimmtes Feld haben, unabhängig vom Wert des Feldes. Wenn möglich, verwenden Sie die Abfragesprache, nicht die API.Finden Sie alle Lucene Dokumente mit einem bestimmten Feld
Gibt es einen Weg?
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.
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.
Eine andere Lösung wird unter Verwendung eines ConstantScoreQuery mit einem FieldValueFilter
new ConstantScoreQuery(new FieldValueFilter("field"))
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. –
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. –
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! –