2009-10-16 7 views
3

Quelle est la manière idiomatique de supprimer les anciens documents d'un index Lucene?Comment supprimer des anciens documents de Lucene/Lucene.NET

J'ai un champ de date (AAAAMMjhhmmss) sur tous les documents, et je voudrais supprimer tout ce qui date de plus d'un jour (par exemple).

Dois-je effectuer une recherche filtrée ou énumérer dans les documents IndexReader? Je suis sûr que la question est la même, quelle que soit la plate-forme utilisée par Lucene.

Merci!

Répondre

3

La recherche de YYYYMMdd * devrait fonctionner car les dates actuelles sont stockées sous forme de chaînes de texte. Une fois que vous avez les résultats, vous pouvez utiliser IndexReader.delete pour supprimer les documents qui ne vous intéressent pas. Cela me semble le meilleur moyen d'y parvenir.

+0

Un problème que je vois avec cette approche est que j'obtiendrai une exception "TooManyClauses" quand il y a plus de 1024 anciens documents. –

+0

Cela dépend vraiment de votre implémentation. J'aurai besoin de connaître les détails, mais en règle générale, vous pouvez soit supprimer cet avertissement pour ces recherches puisqu'elles sont de toute façon seulement de maintenance (en augmentant le nombre de clauses max), soit effectuer des recherches plus spécifiques (YYMMddhh * etc.). Encore une fois, tout dépend de votre environnement et de votre implémentation. – synhershko

+0

J'ai fini par faire une légère variation de ceci, en utilisant un MatchAllDocsQuery et un RangeFilter. Ça semble fonctionner jusqu'à maintenant ... –

2

Vous pouvez essayer d'utiliser des API de bas niveau de Lucene.

Récupère l'énumérateur Term de l'index avec le terme "YYYY". Itérer du terme d'énumérateur pour obtenir des termes. Si le texte du terme ne correspond pas à la date actuelle (ou à la date précédente), appelez IndexReader.deleteDocuments (terme) avec ce terme.

Étant donné que vous n'utilisez pas l'objet de requête, vous ne recevrez pas d'exception liée à la recherche.

Questions connexes