Lucene.NET "ODER"

8

Wie mache ich ein "ODER" in Lucene.NET. Grundsätzlich habe ich ein Array von IDs, und ich möchte alle Datensätze zurückgeben, in denen ein bestimmtes Feld einen der Werte enthält. Ich habe das vorher mit nur einem Wert gemacht, aber jetzt möchte ich den folgenden Code konvertieren, so dass MetaDataID ein Array von möglichen Werten statt eines einzelnen Wertes ist.

%Vor%     
Kyle 13.01.2010, 13:31
quelle

4 Antworten

10

Wenn Sie Lucene-Abfragen kombinieren, bei denen Sie einen Indexdatensatz erstellen möchten, der einen beliebigen von mehreren möglichen Werten mit zusätzlichen Kriterien enthält, die ebenfalls erfüllt sein müssen, erstellen Sie mehrere boolesche Abfrageobjekte.

Für die erste Gruppe von "OR" Bedingungen:

%Vor%

Kombinieren Sie sie jetzt mit anderen Bedingungen in der Abfrage

%Vor%

Jetzt werden Index-Datensätze nur zurückgegeben, wenn sie eine der Bedingungen in der inneren "OR" -Gruppe erfüllen und auch die Bedingungen in der "anderen Bedingungen" -Abfrage erfüllen.

    
Zarepheth 17.04.2012 20:33
quelle
4

Sie müssen BooleanClause.Occur.SHOULD anstelle von BooleanClause.Occur.MUST

verwenden

z.B.:

%Vor%     
Sam Doshi 14.01.2010 12:31
quelle
3

Wenn Sie Ihre Abfrage wirklich analysieren möchten, müssen Sie nur den richtigen Analyzer und das richtige Format für Ihre Abfrage auswählen.

Der StandardAnalyzer ist keine gute Wahl, wenn Sie etwas anderes als englischen Volltext indizieren, besonders nicht in Ihrem Fall! Es filtert Zahlen aus!

Die kürzeste Lösung in Ihrem Fall besteht darin, einen Analysator zu erstellen, der an einem Trennzeichen tokenisiert und Ihr Objekt zu einer Zeichenfolge kombiniert.

Beispiel:

Erstellen Sie einen Tokenizer, der sich bei typischen Trennzeichen aufspaltet, und einen Analyzer, der ihn verwendet

%Vor%

Verwenden Sie den neuen Analysator in Ihrem Parser

(Sie müssen System.Linq einschließen)

%Vor%     
Markus 08.02.2012 13:34
quelle
2

Seien Sie vorsichtig, wenn Sie BooleanQuery zum Abrufen von Dokumenten über die ID verwenden, da die Anzahl der maximalen booleschen Klauseln begrenzt ist.

Die grundlegende "OR" -Klausel in Lucene wird wie folgt ausgeführt, vorausgesetzt, Ihr durchsuchbares Feld hat den Namen "id":

"ID: 1 ID: 2 ID: 3 ID: 4"

Anstelle einer "AND" -Abfrage:

"+ id: 1 + id: 2 + id: 3 + id: 4"

Die Verwendung des Standard-QueryParser und eines StringBuilders sollte die Magie für Sie tun.

    
dandel 24.10.2011 17:57
quelle

Tags und Links