2009-10-16 1 views
3

Что такое идиоматический способ удаления старых документов из индекса Lucene?Как удалить старые документы из Lucene/Lucene.NET

У меня есть поле даты (YYYYMMddhhmmss) на всех документах, и я хотел бы удалить что-нибудь большее, чем один день (например).

Должен ли я выполнять отфильтрованный поиск или перечислять через документы IndexReader?

Уверен, что вопрос тот же, независимо от того, на какой платформе работает Lucene.

Спасибо!

ответ

3

Поиск YYYYMMdd * должен работать, поскольку в настоящее время даты хранятся в виде текстовых строк. После того, как у вас есть результаты, вы можете использовать IndexReader.delete, чтобы удалить документы, которые вам не интересны. Мне кажется, что это лучший способ достичь этого.

+0

Одна из проблем, которые я вижу с этим подходом, заключается в том, что я получу исключение «TooManyClauses», когда имеется более старых 1024 документов. –

+0

Это действительно зависит от вашей реализации. Мне нужно будет знать специфику, но, как правило, вы можете либо удалить это предупреждение для этих поисков, так как они поддерживают только в любом случае (путем установки большего количества предложений clause) или для более конкретных поисков (YYMMddhh * и т. Д.). Опять же, все зависит от вашей среды и реализации. – synhershko

+0

В результате я немного изменил это, используя MatchAllDocsQuery и RangeFilter. Кажется, работает до сих пор ... –

2

Вы можете попробовать использовать низкоуровневые API-интерфейсы Lucene.

Получить термин Перечислитель из индекса с термином «ГГГГ». Итерация термина перечислителя для получения условий. Если текст слова не совпадает с текущей датой (или предыдущей датой), вызовите IndexReader.deleteDocuments (term) с этим термином.

Поскольку вы не используете объект Query, вы не получите исключение, связанное с поиском.