Лучший способ создать индекс Lucene с полями, которые можно часто обновлять, и фильтровать результаты по этому полю - PullRequest
1 голос
/ 01 ноября 2010

Я использую Lucene для индексации своих документов и поиска. На самом деле у меня есть 800k документов, проиндексированных в Lucene. Эти документы имеют несколько полей:

Id : числовое поле для индексации документов

Имя : текстовое поле для хранения и анализа

Описание : как имя

Доступность : числовое поле для фильтрации результатов. Это поле можно обновлять часто, каждый день.

У меня вопрос : как лучше создать фильтр доступности?

1 - добавить эту информацию в индекс и создать фильтр для люценов. При таком подходе мне приходится обновлять документ (удалять и добавлять, потому что в lucene 3.0.2 нет поддержки обновления) каждый раз, когда меняется «доступность». Какова стоимость переиндексации?

2 - не добавляют эту информацию в индекс, а фильтруют результаты с помощью выбора БД. Этот подход будет делать много выборов, потому что мне нужно выбрать каждый идентификатор из базы данных, чтобы проверить доступность.

3 - Создать отдельный индекс с идентификатором и доступностью. Я не знаю, является ли это хорошим решением, но я могу создать индекс со статической информацией, а другой с информацией можно часто обновлять. Я думаю, что лучше обновлять весь документ только потому, что некоторые поля были обновлены.

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

Я бы держался подальше от 2, если вы можете иметь дело только с поиском в lucene, вместо поиска в lucene + db, сделайте это.Я имею дело с этим делом в моем проекте (поиск Lucene + поиск в БД), но я делаю это, потому что выхода из него нет.

Стоимость обновления внутренне:

  • удалить документ

  • вставить новый документ (с новым полем).

Я бы просто попробовал подход № 1 (как самый простой), если производительность достаточно хорошая, тогда просто придерживайтесь ее, если нет, то вы можете искать способы ее оптимизации илипопробуйте 3.

0 голосов
/ 02 ноября 2010

Ответ от lucene-groupmail:

Как часто "часто"?Сколько обновлений вы ожидаете сделать за день?И как быстро эти обновления должны отражаться в результатах поиска?

800K документов не так уж много.Сначала я бы пошел с простым подходом и отслеживал результаты, затем # переходил к более сложному решению, если вы видите возникшую проблему.Просто обновите (удалите / добавьте) документы при изменении значения.

Что ж, стоимость переиндексации примерно равна стоимости ее первоначального индексирования.Старая версия документа помечается как удаленная, а новая добавляется.Это по сути та же стоимость, что и для индексации нового документа.Это оставляет некоторые пробелы в вашем индексе, то есть удаленные документы все еще находятся там, но следующая оптимизация их сожмет.Я бы сделал это, скажем, один раз в день (или даже еженедельно).

HTH Эрик

...