Можно ли получить результаты поиска в режиме реального времени, отсортированные путем частого обновления поля с Lucene 3.0 в Java - PullRequest
2 голосов
/ 09 января 2010

Рассмотрим следующие предположения:

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 10 января 2010

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

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

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

1 голос
/ 10 января 2010

Поиск в режиме реального времени доступен в 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 документов в секунду без значительного замедления.

...