Buscar..


Introducción

Eliminar documentos de un índice de Lucene es fácil cuando tiene un campo de clave principal en su documento (como en las bases de datos SQL tradicionales).

Sin embargo, a veces, eliminar un número de documentos basados ​​en múltiples campos en el documento es lo que necesita. La API de Lucene le permite lograr esto especificando una consulta para usar para la eliminación.

Para hacer esto, seleccione el Analizador correcto, construya la consulta, pase la consulta al indexWriter para eliminar los documentos.

Sintaxis

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

Observaciones

Advertencias con la elección del analizador

No es inmediatamente obvio, pero el analizador que está utilizando hace una gran diferencia en la forma en que se ejecuta su consulta. Esto se debe a que el analizador estándar filtra las palabras comunes en inglés como "el" y "a". Es posible que desee elegir un analizador diferente (como KeywordAnalyzer) para que coincida exactamente. Esto obviamente depende de su aplicación de Lucene, por supuesto.

Elección del analizador

En primer lugar, observe qué analizador está utilizando. Me quedé perplejo por un tiempo solo para darme cuenta de que el analizador estándar filtra las palabras comunes como 'el' y 'a'. Este es un problema cuando su campo tiene el valor 'A'. Es posible que desee considerar el Analizador de palabras clave:

Vea este post alrededor del analizador.

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

Analizador de consultas

A continuación, puede crear su consulta utilizando el QueryParser:

Consulte esta publicación acerca de anular el operador predeterminado.

// 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 de consulta

O puede lograr lo mismo construyendo la consulta usted mismo utilizando su API:

Vea este tutorial sobre la creación 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);

Eliminar los documentos que coinciden con la consulta

Luego, finalmente pasamos la consulta al escritor para eliminar los documentos que coinciden con la consulta:

Vea la respuesta a esta pregunta.

Vea la API aquí

// 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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow