Ricerca…


introduzione

Cancellare documenti da un indice di Lucene è facile quando hai un campo chiave primaria nel tuo documento (come nei tradizionali database SQL).

Tuttavia, a volte l'eliminazione di un numero di documenti basato su più campi nel documento è ciò di cui hai bisogno. L'API Lucene consente di ottenere ciò specificando una query da utilizzare per l'eliminazione.

Per fare ciò, selezionare l'analizzatore giusto, costruire la query, passare la query a indexWriter per eliminare i documenti.

Sintassi

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

Osservazioni

Avvertenze con la scelta dell'analizzatore

Non è immediatamente ovvio, ma l'analizzatore che stai utilizzando fa un'enorme differenza nel modo in cui viene eseguita la tua query. Questo perché StandardAnalyzer filtra le parole inglesi comuni come "the" e "a". Potresti voler scegliere un altro analizzatore (come KeywordAnalyzer) in modo che corrisponda esattamente. Questo ovviamente dipende dall'applicazione di Lucene, ovviamente.

Scelta dell'analizzatore

Prima di tutto, fai attenzione a quale analizzatore stai usando. Sono rimasto per un po 'perplesso solo per rendermi conto che lo StandardAnalyzer filtra parole comuni come "il" e "un". Questo è un problema quando il tuo campo ha il valore 'A'. Potresti considerare KeywordAnalyzer:

Vedi questo post attorno all'analizzatore.

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

Query Parser

Successivamente, è possibile creare la query utilizzando QueryParser:

Vedi questo post che ignora l'operatore predefinito.

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

API di query

Oppure puoi ottenere lo stesso costruendo la query da solo usando la loro API:

Vedi questo tutorial sulla creazione di 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);

Elimina i documenti che corrispondono alla query

Infine, passiamo la query allo scrittore per eliminare i documenti che corrispondono alla query:

Vedi la risposta a questa domanda.

Vedi l'API qui

// 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow