编写一个搜索引擎

4
标题可能有点误导人,但我想不出更好的标题。我正在编写一个简单的搜索引擎,它将在几个网站上搜索特定域名。具体来说:我正在为hardstyle livesets / aftermovies / tracks编写搜索引擎。为此,我将在提供livesets、tracks等内容的网站上进行搜索。问题在于速度,我需要将搜索查询传递给5-7个网站,获取结果,然后使用自己的算法按照排序顺序显示结果。我可以“多线程”处理它,但这比说起来容易做起来难,所以我有一些问题。

  1. 对于这个问题,最好的解决方案是什么?我应该只是多线程/进程化这个应用程序,这样我就会得到一些加速吗?
  2. 是否有其他解决方案,或者我做错了什么?

谢谢,

William van Doorn

5个回答

3

如果你不是想学习多线程编程,那么最好避免自己编写此类基础设施。同步许多可能需要不同时间的任务、处理失败等问题,会很混乱。

对于大部分可以并行处理的任务(如查询多个网站、合并结果等),你可以考虑使用现有的基础设施。

Map/reduce框架(如Java中的Hadoop)可以为你处理其中的一些问题,让你专注于应用程序的逻辑。


这个基础架构会很复杂吗?现在我们谈论的是Java,我只需要创建一个带有简单Runnable的ExecutorService。但是我们将看看Hadoop,谢谢。 - wvd
@wvd:这真的取决于规模和你想要并行化的程度。对于小型输入和结果,你可以自己编写代码。 如果你有大量的站点需要查询和大量的结果需要合并,特别是如果你需要使用多个进程来查询大量的结果,那么使用映射/归约工具的基础设施和鲁棒性以及提高的性能会很有帮助。 - Uri

1

对于搜索引擎,我建议您查看Solr或Lucene。对于5-7个站点,Hadoop可能会过度杀伤力。

增量索引是可能的,并且可以向每个可搜索的内容添加特定的元数据。

我可以想象这些网站也会在RSS提要中发布大量内容,您可以使用它们来更快地更新索引,而不必不断地爬行它们。

搜索引擎本身允许以各种有趣的方式快速获取结果,以进行后处理或立即显示给用户。

对于并行化,JSR-166y包(java.util.concurrent)提供了出色的支持,如果您坚持使用其中一个提出的模式,则可以轻松实现并行化。它们非常有效。

这只是一些想法。


0

我会尝试在这里使用一些伪代码:

// 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
}

是的,我知道如何做 -- 但我只是想知道这是否是正确的方法。 - wvd
有人可能会觉得它很有用,你不觉得吗? - Boris Pavlović

0

用谷歌吗?;)

瓶颈将是下载信息,使用多线程将有所帮助。

否则只下载HTML。


0

你可以使用Map/Reduce来完成这种任务。Hadoop是Java的一种实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接