Zoeken…


Invoering

Het verwijderen van documenten uit een Lucene-index is eenvoudig wanneer u een primair sleutelveld in uw document heeft (zoals in traditionele SQL-databases).

Soms is het echter nodig om een aantal documenten te verwijderen op basis van meerdere velden in het document. Met de Lucene API kunt u dit bereiken door een query op te geven die moet worden gebruikt voor verwijdering.

Kies hiervoor de juiste Analyzer, stel de query samen en geef de query door aan de indexWriter om de documenten te verwijderen.

Syntaxis

  1. indexWriter.deleteDocuments (multiTermQuery);
  2. Query multiTermQuery = new QueryParser ("", analyzer) .parse ("field_name1:" field value 1 "AND field_name2:" field value 2 "");
  3. BooleanQuery multiTermQuery = new BooleanQuery (); multiTermQuery.add (nieuwe TermQuery (nieuwe Term ("field_name1", "field value 1")), BooleanClause.Occur.MUST); multiTermQuery.add (nieuwe TermQuery (nieuwe term ("field_name2", "field value 2")), BooleanClause.Occur.MUST);

Opmerkingen

Voorbehoud met de keuze van Analyzer

Het is niet meteen duidelijk, maar de analyzer die u gebruikt, maakt een enorm verschil in de manier waarop uw zoekopdracht wordt uitgevoerd. Dit komt omdat de StandardAnalyzer veelgebruikte Engelse woorden zoals "de" en "een" filtert. Misschien wilt u een andere analyser kiezen (zoals KeywordAnalyzer) zodat deze exact overeenkomt. Dit hangt natuurlijk natuurlijk af van je toepassing van Lucene.

Keuze van Analyzer

Let allereerst op welke analyzer u gebruikt. Ik was een tijdlang stomverbaasd om me te realiseren dat de StandardAnalyzer veelvoorkomende woorden als 'de' en 'een' eruit filtert. Dit is een probleem wanneer uw veld de waarde 'A' heeft. Misschien wilt u de KeywordAnalyzer overwegen:

Zie dit bericht rond de analyser.

// 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();

Zoekopdracht Parser

Vervolgens kunt u uw query maken met QueryParser:

Zie dit bericht over het vervangen van de standaardoperator.

// 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\"");

Query API

Of u kunt hetzelfde bereiken door de query zelf te bouwen met behulp van hun API:

Bekijk deze tutorial over het maken van de BooleanQuery.

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);

Verwijder de documenten die overeenkomen met de zoekopdracht

Vervolgens geven we de query eindelijk door aan de schrijver om documenten te verwijderen die overeenkomen met de query:

Zie het antwoord op deze vraag.

Bekijk de 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow