Асинхронный поиск - PullRequest
3 голосов
/ 23 мая 2009

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

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

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

Приветствия

Ответы [ 3 ]

1 голос
/ 29 мая 2009

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

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

0 голосов
/ 31 мая 2009

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

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

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

0 голосов
/ 28 мая 2009

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

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

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

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

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

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

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

...