2009-05-23 2 views
3

В настоящее время я работаю над созданием доказательств для решения концепции поиска для моей компании с использованием поиска Lucene и Hibernate. Я создал отдельные компоненты, которые отлично работают. Теперь я рассматриваю создание единого API, который позволит пользователю получать результаты поиска из разных источников (домен + данные). То, что я хотел бы достичь, - это что-то вроде менеджера поиска, который запускает запросы поиска к различным компонентам поиска асинхронно и когда один набор результатов обрабатывается, возвращает результат, получаемый пользователю при обработке остальных. Как только результат поиска будет обработан, уведомите клиента о наличии большего количества результатов поиска.Асинхронный поиск

Мне интересно, есть ли у меня менеджер поиска, который создает отдельные потоки для поиска отдельных компонентов поиска и ведет список результатов поиска. После того, как список будет заполнен одним возвратом, возвращающимся к пользователю. Любые дополнительные результаты поиска добавили бы менеджера поиска, который подталкивал результаты к пользователю.

Я не ищу какой-либо пример кода (любой был бы оценен), но мне было интересно узнать, могу ли я получить какое-то руководство по решению этой проблемы. Использую ли я технологии обработки событий (GigaSpaces, Spring, JMS) или использует стандартные параллельные библиотеки Java. Каким будет эффективный способ управления списком и продвигать обновленные результаты.

Приветствия

+0

Что такое «клиент» в этом сценарии? Это приложение Java, браузерное веб-приложение и т. Д.? –

ответ

0

Если вы создаете класс для каждого типа поиска менеджера, например, Lucene, каждый из которых реализует асинхронный интерфейс поиска, с которым вы сможете справиться только с «нормальными» Java-материалами.

Я бы думать о следующих строках:

Создать безопасный сбор нити (набор, если вы не хотите, дублированный поиска) с правильными свойства в зависимости от того, хотите ли вы заказ, будет случайный доступ к данным в нем или просто повторение. Обычная структура данных для использования материала.

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

Реализации этого интерфейса для каждого метода поиска. Каждый вызов метода поиска создает свой собственный поток при вызове, который запускает поиск, этот поток помещает результаты поиска в предоставленную коллекцию.

Менеджер поиска просто выполняет итерацию по всем известным поисковым системам (зарегистрированным где-то) и выполняет поиск по каждому из них с заданным запросом.

Надеюсь, что это поможет.

1

Это звучит идеально для абстракции Executor Service в Java 5 и выше. Вы можете отправлять задачи в пул исполнительных потоков и асинхронно опроса для завершения.

Итак, в вашем случае вы должны создать каждый поиск как свою собственную задачу, а затем опросить эти задачи для завершения. Как только они закончатся, возьмите результаты и скопируйте их для пользователя.

0

Я рассмотрел шаблон Scatter-Gather: асинхронно транслировать запрос с помощью JMS (или какой-либо другой технологии обмена сообщениями), собирать ответы до тех пор, пока не будет достигнут тайм-аут или не вернется минимальное количество результатов поиска, а затем сообщите о результатах до сих пор конечному пользователю.

Преимущество использования JMS или аналогичного заключается в том, что вы избегаете связывания нескольких потоков, ожидающих reponses, и у вас есть механизм для обработки ответов, которые поступают после того, как первый результирующий набор возвращается пользователю.

Возможно, вы захотите изучить Solr, сервер поиска с открытым исходным кодом на основе Lucene, и как они справляются с этими проблемами.

Смежные вопросы