Можно ли получить результаты поиска в реальном времени, отсортированные путем частого обновления поля с помощью Lucene 3.0 в Java
Рассмотрим следующие предположения:
- У меня есть веб-приложение Java 5.0, для которого я собираюсь использовать Lucene 3.0 для полнотекстового поиска
- Будет более 1000 тысяч документов Lucene, каждый из которых содержит 100 слов (в среднем)
- Новые документы должны быть доступны для поиска сразу после их создания (поиск в реальном времени)
- В документах Lucene часто обновляется целочисленное поле с именем quality
Где найти примеры кода (простого, но максимально полного) поиска Lucene 3.0 в реальном времени?
Можно ли получить результаты запроса, отсортированные по одному из полей документа (качество), которое может часто обновляться (для уже проиндексированного документа)? Такое обновление поля документа должно вызвать перестройку индекса Lucene? Какова эффективность такой реконструкции? Как это сделать эффективно - мне нужно несколько примеров / документации полного решения.
Однако, если в этом случае не обязательно требуется перестроение индекса - как эффективно отсортировать результаты поиска? Могут быть запросы, возвращающие большое количество документов (>50 КБ), поэтому я считаю неэффективным получать их несортированные из Lucene, а затем сортировать их по полю качества и, наконец, разделить отсортированный список на страницы для разбивки на страницы.
Является ли Lucene 3.0 моим лучшим выбором в Java или я должен рассмотреть некоторые другие фреймворки / решения? Может быть, полнотекстовый поиск предоставляется самим SQL Server (я использую PostgreSQL 8.3)?
2 ответа
Lucene API способен на все, что вы просите, но это будет нелегко. Это довольно низкоуровневый API, и делать из него сложные вещи - само по себе упражнение.
Я очень рекомендую Compass, который является фреймворком для поиска / индексации, построенным на основе Lucene. Помимо более дружественного API, он обеспечивает такие функции, как сопоставление объектов /XML/JSON с индексами Lucene, а также полностью транзакционное поведение. Он не должен иметь проблем с вашими требованиями, такими как сортировка в режиме реального времени обновленных документов.
Compass 2.2.0 построен на Lucene 2.4.1, но версия на основе Lucene 3.0 находится в разработке. Это достаточно абстрагировано от Lucene API, что переход должен быть плавным.
Поиск в режиме реального времени доступен в Lucene с версии 2.9. В Lucid Imagination есть статья об этой возможности (до выпуска 2.9). Основная идея в том, что теперь вы можете получить IndexReader от IndexWriter. Если вы регулярно обновляете этот IndexReader, вы получите большинство изменений даты от IndexWriter.
Обновление: я не видел никакого кода, но вот широкая идея.
Весь новый документ будет записан на IndexWriter
желательно с RAMDirectory
, который не будет часто закрываться. (Чтобы сохранить этот индекс в памяти, вам, возможно, придется иногда записывать его на диск.)
У вас будет несколько индексов на диске, на котором будут создаваться отдельные IndexReaders. Наверху этих читателей могут быть созданы MultiReader и Searcher. Один из ридеров будет из индекса в памяти.
Через регулярные интервалы (скажем, несколько секунд) вы удаляете текущий Reader из MultiReader, получаете новый Reader из IndexWriter и создаете MultiReader/Searcher с новым набором Readers.
Согласно статье в Lucid Imagination (ссылка выше), они пытались писать 50 документов в секунду без значительного замедления.