Написание поисковой системы - PullRequest
4 голосов
/ 18 июня 2010

Название может быть немного вводящим в заблуждение, но я не мог найти лучшего названия. Я пишу простую поисковую систему, которая будет искать на нескольких сайтах для конкретного домена. Чтобы быть конкретным: я пишу поисковик для hardstyle livesets / aftermovies / дорожек. Для этого я буду искать на сайтах, которые предоставляют живые наборы, треки и тому подобное. Проблема здесь в скорости, мне нужно передать поисковый запрос на 5-7 сайтов, получить результаты и затем использовать мой собственный алгоритм для отображения результатов в отсортированном порядке. Я мог бы просто «многопоточить» это, но легче сказать, чем сделать, поэтому у меня есть несколько вопросов.

  1. Как лучше всего решить эту проблему? Должен ли я просто выполнить многопоточность / обработать это приложение, чтобы я немного ускорился?

  2. Есть ли другие решения или я делаю что-то действительно неправильно?

Спасибо

Уильям ван Дорн

Ответы [ 5 ]

3 голосов
/ 18 июня 2010

Если вы не пытаетесь научиться многопоточности, не пишите инфраструктуру для этого самостоятельно. Синхронизация множества задач, которые могут занимать разное время, обработка сбоев и т. Д., Это беспорядок.

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

Карты / редукторы (такие как Hadoop для Java) могут справиться с некоторыми из них за вас, позволяя вам сосредоточиться на логике вашего приложения.

1 голос
/ 18 июня 2010

В конкретном случае поисковой системы я рекомендую вам проверить Solr или Lucene.Для 5-7 сайтов Hadoop, вероятно, будет излишним.Возможна инкрементная индексация, а также добавление определенных метаданных к каждой из доступных для поиска вещей.

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

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

Для распараллеливания в пакетах JSR-166y есть отличная поддержка(java.util.concurrent), которые позволяют распараллеливание без головной боли, если вы придерживаетесь одного из предложенных шаблонов.Они работают очень хорошо.

Просто некоторые мысли.

0 голосов
/ 18 июня 2010

Вы можете использовать Map / Reduce для такого рода задач. Hadoop - это реализация в Java

0 голосов
/ 18 июня 2010

Я постараюсь использовать здесь псевдокод:

// main thread

barrier = Barrier(numberOfQueries) // initialize the barrier 
                                   // with number of working threads

for (i = 0; i < numberOfQueries; i++) {
  workers(i) = Worker(i, barrier) // create a worker passing the barrier
  workers(i).start() // start a worker
}

barrier.await() // wait until the barrier resets to ZERO

for (i = 0; i < numberOfQueries; i++) {
  results(i) = workers(i).result // collect the results
}

display(results) // display the results


// worker thread

function start() {
  doTheJob() // do the long job of querying a site
  this.barrier.decrement // once the job is finished decrement the barrier
}
0 голосов
/ 18 июня 2010

Используете Google?;)

Узким местом будет загрузка информации, многопоточность поможет.

В противном случае загрузите только HTML.

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