2010-01-09 2 views
2

Рассмотрим следующие предположения:Можно ли получить реальные результаты поиска по времени, отсортированные по часто обновляемого поля с Lucene 3.0 в Java

  1. У меня есть Java 5.0 веб-приложений, для которых я рассматриваю использовать Lucene 3.0 для полного -text поиск
  2. Там будет больше, чем 1000K Lucene документов, каждый из 100 слов (в среднем)
  3. Новые документы должны быть доступны для поиска, после того, как они созданы (в режиме реального времени поиска)
  4. Lucene документы часто обновляет целое поле названное качество

Где найти примеры кода (простое, но максимально возможное) поиска в режиме реального времени Lucene 3.0?

Возможно ли получить результаты запроса, отсортированные по одному из полей (качества) документа, которые могут часто обновляться (для уже проиндексированного документа)? Такое обновление поля документа должно будет привести к восстановлению индекса Lucene? Какова производительность такой перестройки? Как это сделать эффективно - мне нужны примеры/документация для полного решения.

Если, однако, восстановление индекса не обязательно необходимо в этом случае - как эффективно сортировать результаты поиска? Могут быть запросы, возвращающие много документов (> 50K), поэтому я считаю неэффективным получение их несортированными из Lucene, а затем сортировка их по качеству поля и, наконец, разделение отсортированного списка на страницы для разбивки на страницы.

Является ли Lucene 3.0 лучшим выбором на Java или я должен рассмотреть некоторые другие рамки/решения? Возможно, полный текстовый поиск, предоставляемый самим SQL Server (я использую PostgreSQL 8.3)?

ответ

4

API Lucene способен на все, что вы просите, но это будет непросто. Это довольно низкоуровневый API, и сделать его сложным, это само по себе упражнение.

Я могу очень порекомендовать Compass, который представляет собой структуру поиска/индексации, построенную на вершине Луцен. Помимо гораздо более дружественного API, он предоставляет такие функции, как отображение объектов/XML/JSON для индексов Lucene, а также полностью транзакционное поведение. Он не должен беспокоить ваши требования, такие как сортировка транзакционно обновленных документов в режиме реального времени.

Compass 2.2.0 построен на Lucene 2.4.1, но версия Lucene 3.0 работает. Это достаточно абстрагировано от API Lucene, хотя переход должен быть бесшовным.

+1

Компас кажется интересным, поэтому я дам ему попробовать. – WildWezyr

+0

Где я могу найти простой пример добавления некоторых объектов (ресурсов/документов и т. Д.) В Compass, а затем поиск с указанным порядком сортировки? Я попробовал это самостоятельно на основе документации (это было не очень полезно) и одного из примеров из дистрибутива Compass, но я потерпел неудачу. Я не знаю, как начать и где учиться ... – WildWezyr

+0

Форум Compass довольно хорош, я получил хорошую помощь в прошлом. – skaffman

1

В режиме реального времени Поиск доступен в Lucene since 2.9. Lucid Imagination имеет an article об этой возможности (до выпуска 2.9). Основная идея заключается в том, что теперь вы можете получить IndexReader от IndexWriter. Если вы обновите этот IndexReader с регулярным интервалом, вы получите больше изменений даты от IndexWriter.

Обновление: Я не видел никакого кода, но вот широкая идея.

Весь документ nw будет записан в IndexWriter, предпочтительно с RAMDirectory, который не будет закрыт часто. (Чтобы сохранить этот индекс в памяти, вам может потребоваться очистить его на диск.)

У вас будут некоторые индексы на диске, на котором будут созданы отдельные IndexReaders. Наверх этих Readers могут быть созданы MultiReader и Searcher. Один из Reader будет из индекса in-memory.

С регулярным интервалом (скажем, несколько секунд) вы удаляете текущий Reader из MultiReader, получаете новый Reader от IndexWriter и создаете MultiReader/Searcher с новым набором Readers.

Согласно статье Lucid Imagination (ссылка выше), они попытались записать 50 документов в секунду без сильного замедления.

+0

Где я могу найти примеры кода для этого? Как и когда я должен обновить IndexReader? Сколько времени потребуется (производительность)? Могу ли я выполнять поиск, пока IndexReader обновляется? – WildWezyr

+0

Спасибо за ваше обновление. Это дает мне обзор сложности использования почти в режиме реального времени поиска в самой Lucene. Как скаффман сказал: «API Lucene способен на все, что вы просите, но это будет нелегко. Это довольно низкоуровневый API, и сделать его сложным, это само по себе упражнение». Прямо сейчас я смотрю на Compass, поскольку он обещает сделать мне грязную работу ;-). – WildWezyr

+0

В Lucene 2,9 добавлены кабабилиты реального времени. Если Compass имеет предыдущие версии Lucene, вы, вероятно, не увидите в реальном времени лакомства. –