Каков наилучший способ поиска нескольких источников одновременно? - PullRequest
3 голосов
/ 19 ноября 2009

Я пишу поиск в телефонной книге, который будет запрашивать несколько удаленных источников, но мне интересно, как лучше подойти к этой задаче.

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

НО ... какой из удаленных источников более важен, если все источники возвращают как минимум 10 результатов, поэтому мне придется выполнить поиск по результатам поиска. Хотя это даст точную информацию, оно кажется неэффективным и вряд ли будет хорошо масштабироваться.

Есть ли коммерческое или открытое решение, которое я мог бы использовать и расширять, или я могу использовать умный алгоритм, который я пропустил?

Спасибо

Ответы [ 2 ]

2 голосов
/ 19 ноября 2009

Джон, я верю, что вы хотите федеративный поиск . Я предлагаю вам проверить Solr в качестве основы для этого. Я согласен с Ником, что вам придется самостоятельно оценивать относительное качество различных источников и создавать функцию слияния. Solr имеет некоторую инфраструктуру для этого, как показывает электронная почта .

0 голосов
/ 19 ноября 2009

Если честно, я не видел готового решения, но именно поэтому мы, программисты, существуем: чтобы создать решение, если оно недоступно :-)

То, как я бы это сделал, похоже на то, что вы описываете: использование потоков - если это веб-приложение, то ajax - ваш друг по скорости и удобству использования, для представления графического интерфейса настольного приложения даже не проблема.

Похоже, вы не можете заранее определить или угадать, какой источник является лучшим с точки зрения надежности, скорости и количества результатов. Поэтому вам нужно настроить программу так, чтобы она определяла лучшие результаты на лету. Допустим, у вас есть 10 источников данных и, следовательно, 10 потоков. Когда вы запустите свои потоки - подождите, пока первый из них вернется с результатами> 0. Это будет ваш "главный" результат. Когда другие потоки возвращаются, вы можете сравнить их с вашим «основным» результатом и добавить новые результаты. Нет никакого способа избежать этого, если вы хотите предоставить уникальные результаты. Вы можете начать отображать результаты, как только у вас появится первая тема. Вам не нужно сразу обновлять экран, добавляя в него все новые результаты, но если это займет некоторое время, пользователь может заволноваться. Вы можете просто иметь какой-то индикатор, который показывает, что доступно больше результатов, например, если у вас их больше 10.

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

Другой подход - к пользователю f00l. Вроде как сайты поиска авиабилетов делают - где они заставляют вас хотеть несколько секунд, пока они собирают и сортируют результаты. Мне очень нравится реализация Kayak.com - она ​​заставляет меня чувствовать, что она делает что-то непохожее на некоторые другие сайты.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...