Я создаю сборщик RSS-каналов, в котором все новости из каждого URL-адреса канала хранятся в виде документа индекса Lucene.
Если я получу http-код ответа 304 (не изменен), или дата канала соответствуеткэшировал один, тогда я ничего не делаю, если нет (канал изменяется с момента последнего запроса), я должен был бы удалить все документы с полем feed_url
, установленным на URL моего канала.
Так вот что ясделать для каждого обновленного фида
for (Feed feed : updatedFeeds) {
writer.deleteDocuments(new Term("feed_url", feed.getUrl()));
for (News news : feed) {
Document document = new Document();
document.add(new StringField("feed_url", feed.getUrl(), org.apache.lucene.document.Field.Store.NO));
document.add(new StringField("url", news.getUrl(), org.apache.lucene.document.Field.Store.NO));
document.add(new TextField("tags", news.getTagsAndTokenizableText(), org.apache.lucene.document.Field.Store.NO));
document.add(new StoredField("news", news.serialize()));
writer.updateDocument(new Term("url", news.getUrl()),
document);
}
}
Сценарий наихудшего случая: каждый фид обновляется с момента последнего http-запроса, поэтому каждая запись в индексе Lucene удаляется.
Наилучшим подходом будетудалить только те новости, которых нет в ленте, но которые есть в индексе Lucene, затем добавить новости, которые есть в ленте, но отсутствуют в индексе Lucene, но я не нашел способа сделать это с помощью Apache Lucene