Recherche…


Introduction

La suppression de documents d'un index Lucene est simple lorsque vous avez un champ clé primaire dans votre document (comme dans les bases de données SQL traditionnelles).

Toutefois, vous avez parfois besoin de supprimer un certain nombre de documents basés sur plusieurs champs du document. L'API Lucene vous permet d'y parvenir en spécifiant une requête à utiliser pour la suppression.

Pour ce faire, sélectionnez le bon analyseur, créez la requête, transmettez la requête à indexWriter pour supprimer les documents.

Syntaxe

  1. indexWriter.deleteDocuments (multiTermQuery);
  2. Requête multiTermQuery = new QueryParser ("", analyseur) .parse ("nom_zone1:" valeur du champ 1 "AND nom_du_2):" valeur du champ 2 "");
  3. BooleanQuery multiTermQuery = new BooleanQuery (); multiTermQuery.add (new TermQuery (new Term ("nom_zone1", "valeur du champ 1")), BooleanClause.Occur.MUST); multiTermQuery.add (new TermQuery (nouveau terme ("nom_zone2", "valeur du champ 2")), BooleanClause.Occur.MUST);

Remarques

Mises en garde avec le choix de l'analyseur

Ce n'est pas immédiatement évident, mais l'analyseur que vous utilisez fait une énorme différence dans la façon dont votre requête est exécutée. Ceci est dû au fait que StandardAnalyzer filtre les mots anglais courants tels que "the" et "a". Vous pouvez choisir un analyseur différent (comme KeywordAnalyzer) pour qu'il corresponde exactement. Cela dépend évidemment de votre application de Lucene bien sûr.

Choix de l'analyseur

Tout d'abord, observez l'analyseur que vous utilisez. J'ai été déconcerté pendant un moment seulement pour réaliser que le StandardAnalyzer filtre les mots communs tels que «le» et «a». Ceci est un problème lorsque votre champ a la valeur 'A'. Vous voudrez peut-être envisager le KeywordAnalyzer:

Voir ce post autour de l'analyseur.

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

Analyseur de requête

Ensuite, vous pouvez soit créer votre requête en utilisant le QueryParser:

Voir ce post sur le remplacement de l'opérateur par défaut.

// 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 requête

Ou vous pouvez obtenir la même chose en construisant vous-même la requête en utilisant son API:

Voir ce tutoriel sur la création 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);

Supprimer les documents correspondant à la requête

Ensuite, nous transmettons enfin la requête à l'auteur pour supprimer les documents correspondant à la requête:

Voir la réponse à cette question.

Voir l'API ici

// 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow