Sök…


Introduktion

Att ta bort dokument från ett Lucene-index är enkelt när du har ett primärt nyckelfält i ditt dokument (som i traditionella SQL-databaser).

Men ibland är det du behöver för att ta bort ett antal dokument baserat på flera fält i dokumentet. Lucene API låter dig uppnå detta genom att ange en fråga som ska användas för borttagning.

För att göra detta väljer du rätt analysator, konstruerar frågan, skickar frågan till indexWriter för att radera dokumenten.

Syntax

  1. indexWriter.deleteDocuments (multiTermQuery);
  2. Query multiTermQuery = new QueryParser ("", analysator) .parse ("field_name1:" field value 1 "AND field_name2:" field value 2 "");
  3. 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);

Anmärkningar

Varningar med valet av analysator

Det är inte direkt uppenbart, men analysatorn som du använder gör en stor skillnad för hur din fråga körs. Detta beror på att StandardAnalyzer filtrerar bort vanliga engelska ord som "the" och "a". Du kanske vill välja en annan analysator (som KeywordAnalyzer) så att den matchar exakt. Detta beror naturligtvis på din tillämpning av Lucene naturligtvis.

Val av analysator

Först av allt, se upp vilken analysator du använder. Jag stubbades för ett tag bara för att inse att StandardAnalyzer filtrerar bort vanliga ord som 'the' och 'a'. Detta är ett problem när ditt fält har värdet 'A'. Du kanske vill överväga KeywordAnalyzer:

Se detta inlägg runt analysatorn.

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

Fråga analys

Därefter kan du antingen skapa din fråga med QueryParser:

Se detta inlägg kring att åsidosätta standardoperatören.

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

Fråga API

Eller så kan du uppnå samma sak genom att konstruera frågan själv med hjälp av deras API:

Se denna handledning kring att skapa 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);

Radera dokumenten som matchar frågan

Sedan skickar vi slutligen frågan till författaren för att ta bort dokument som matchar frågan:

Se svaret på den här frågan.

Se API här

// 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow