2010-12-11 16 views
6

В этой теме есть несколько потоков, но я думаю, что мой прецедент несколько отличается.Полнотекстовый поиск в Google App Engine (Java)

Что я хочу сделать:

  • Полный текст поиска компонент для моего GAE/J приложение
  • Размер индекса мал: 25-50МБ или так
  • не нужны живые обновления индекс, периодическая переиндексация прекрасна
  • Это для автозаполнения и т. п., поэтому это должно быть очень быстро (создается впечатление, что внедрение инвертированного индекса в хранилище данных приводит к значительным задержкам)

Моя стратегия до сих пор (только планирует, не пытались реализовать что-то еще):

  • Используйте Lucene с RAMDirectory
  • Периодическая хрон создает индекс, упорядочивает его в хранилище данных хранит обновления идентификатор (или временная метка)
  • Поиск сервлет загружает индекс при запуске и создает RAMDirectory
  • на каждый запрос сервлет проверяет текущий идентификатор обновления и перезагружает индекс по мере необходимости

Главное, что я нечеткий, это синхронизировать данные в памяти между экземплярами - будет ли это работать, или я что-то упускаю?

Кроме того, как далеко я могу нажать, прежде чем у меня возникнут проблемы с использованием памяти? Я не мог найти что-либо в квотах RAM для GAE. (Этот показатель небольшой, но я могу придумать больше вещей, которые я бы хотел добавить)

И, конечно, какие-либо мысли о лучших подходах?

+0

Память отделена между экземплярами GAE, поэтому каталог прямо вверх RAM не будет общего между ними. Вы должны инициализировать его для каждого экземпляра при запуске. Что может быть не так плохо, учитывая новые резервные серверы и запросы на разминку. –

+0

Ну, да, это часть того, что я изложил выше ... – Dmitri

ответ

0

Ну, с GAE 1.5.0 выглядит как резидентный Backends можно использовать для создания службы поиска.

Конечно, для них нет свободной квоты.

1

Если вы в порядке с периодическими перестройками, а ваш индекс мал, ваш текущий подход звучит в основном в порядке. Вместо того, чтобы строить индекс онлайн и сериализовать его в хранилище данных, однако, почему бы не построить его в автономном режиме и загрузить его с помощью приложения? Затем вы можете создать экземпляр непосредственно из хранилища дисков, а для того, чтобы нажать обновление, вы развертываете новую версию своего приложения.

+0

Я собираюсь обновлять примерно раз в час, поэтому привязка индекса к приложению не кажется хорошим способом. – Dmitri

0

Для автозаполнения, возможно, вы могли бы хранить верхние N совпадений для каждого префикса (в основном, что вы поместили в раскрывающемся меню) в memcache? Объекты memcache могут поддерживаться сущностями в хранилище данных и при необходимости перезагружаться.

1

Недавно GAE добавила услугу «текстового поиска». Посмотрите на GAE Java Text Search

+0

Любая идея о том, как обрабатывать разбиение на страницы результатов в API GAE/J FTS? Я продолжаю получать нулевые курсоры. Благодарю. –