Suche…


Einführung

Das Löschen von Dokumenten aus einem Lucene-Index ist einfach, wenn Sie ein Primärschlüsselfeld in Ihrem Dokument haben (wie in herkömmlichen SQL-Datenbanken).

Manchmal müssen Sie jedoch mehrere Dokumente löschen, die auf mehreren Feldern des Dokuments basieren. Mit der Lucene-API können Sie dies erreichen, indem Sie eine Abfrage angeben, die zum Löschen verwendet werden soll.

Wählen Sie dazu den richtigen Analyzer aus, erstellen Sie die Abfrage, übergeben Sie die Abfrage an den indexWriter, um die Dokumente zu löschen.

Syntax

  1. indexWriter.deleteDocuments (multiTermQuery);
  2. Abfrage multiTermQuery = neuer QueryParser ("", Analysator) .parse ("Feldname1:" Feldwert 1 "UND Feldname2:" Feldwert 2 "");
  3. BooleanQuery multiTermQuery = new BooleanQuery (); multiTermQuery.add (neuer TermQuery (neuer Begriff ("Feldname1", "Feldwert 1")), BooleanClause.Occur.MUST); multiTermQuery.add (neuer TermQuery (neuer Begriff ("Feldname2", "Feldwert 2")), BooleanClause.Occur.MUST);

Bemerkungen

Vorsichtsmaßnahmen bei der Wahl des Analysators

Es ist nicht sofort offensichtlich, aber das von Ihnen verwendete Analysegerät beeinflusst die Art und Weise, wie Ihre Abfrage ausgeführt wird, erheblich. Dies liegt daran, dass der StandardAnalyzer gängige englische Wörter wie "the" und "a" herausfiltert. Möglicherweise möchten Sie einen anderen Analyzer (wie KeywordAnalyzer) auswählen, damit er genau übereinstimmt. Dies hängt natürlich von Ihrer Anwendung von Lucene ab.

Wahl des Analysators

Achten Sie zuerst darauf, welchen Analysator Sie verwenden. Ich war für eine Weile überrascht, als mir klar wurde, dass der StandardAnalyzer gängige Wörter wie 'das' und 'a' herausfiltert. Dies ist ein Problem, wenn Ihr Feld den Wert 'A' hat. Vielleicht möchten Sie den KeywordAnalyzer in Betracht ziehen:

Siehe diesen Beitrag rund um den Analysator.

// Create an analyzer:
// NOTE: We want the keyword analyzer so that it doesn't strip or alter any terms:
// In our example, the Standard Analyzer removes the term 'A' because it is a common English word.
// http://stackoverflow.com/a/9071806/231860
KeywordAnalyzer analyzer = new KeywordAnalyzer();

Abfrageparser

Als Nächstes können Sie Ihre Abfrage entweder mit dem QueryParser erstellen:

In diesem Beitrag wird der Standardoperator überschrieben.

// Create a query parser without a default field in this example (the first argument):
QueryParser queryParser = new QueryParser("", analyzer);

// Optionally, set the default operator to be AND (we leave it the default OR):
// http://stackoverflow.com/a/9084178/231860
// queryParser.setDefaultOperator(QueryParser.Operator.AND);

// Parse the query:
Query multiTermQuery = queryParser.parse("field_name1:\"field value 1\" AND field_name2:\"field value 2\"");

Abfrage-API

Oder Sie erreichen dasselbe, indem Sie die Abfrage mithilfe ihrer API selbst erstellen:

In diesem Tutorial erfahren Sie, wie Sie die BooleanQuery erstellen.

BooleanQuery multiTermQuery = new BooleanQuery();
multiTermQuery.add(new TermQuery(new Term("field_name1", "field value 1")), BooleanClause.Occur.MUST);
multiTermQuery.add(new TermQuery(new Term("field_name2", "field value 2")), BooleanClause.Occur.MUST);

Löschen Sie die Dokumente, die der Abfrage entsprechen

Dann geben wir die Anfrage an den Writer weiter, um Dokumente zu löschen, die der Anfrage entsprechen:

Siehe die Antwort auf diese Frage.

Siehe die API hier

// Remove the document by using a multi key query:
// http://www.avajava.com/tutorials/lessons/how-do-i-combine-queries-with-a-boolean-query.html
indexWriter.deleteDocuments(multiTermQuery);


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow