lucene
Suppression de documents à l'aide d'une requête à plusieurs termes
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
- indexWriter.deleteDocuments (multiTermQuery);
- Requête multiTermQuery = new QueryParser ("", analyseur) .parse ("nom_zone1:" valeur du champ 1 "AND nom_du_2):" valeur du champ 2 "");
- 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.
// 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);