用elasticsearch和nuxtjs搭建bt搜索引擎

本文讲述了作者如何使用现代技术栈,包括Elasticsearch和Nuxtjs,构建一个BT种子搜索引擎。选择Elasticsearch作为全文检索工具,Nuxtjs处理前端SEO需求。文章详细描述了从数据来源、爬虫实现、数据库设计到前后端功能的全过程,以及遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

世界上已经有了这么多种子搜索引擎,为什么你还要不厌其烦的做一个新的?

可以这么说,地球上大多数的种子搜索引擎的前后端技术都比较古老,虽然古老的技术既经典又好用,但是作为一个喜欢尝鲜的人,我仍然决定使用目前最为先进的开发技术制作一个功能简明的种子搜索引擎。

采用了什么技术?

前端:在vue,angular,react三大现代开发框架中选择了vue,做出这个决定的原因也仅仅是一直以来对vue的谜之好感。有时候就是这样,缘分到了不得不从,恰巧nuxtjs在9月更新了2.0,因此毫不犹豫选择了vue。
后端:在koa,gin,springboot中权衡良久,由于很长时间没有写过java,最后选择了springboot + jdk11,用写javascript的感觉来写java,还是很不错的。从追求速度上来讲,可能使用gin或Koa要更快,但是这一点提升对于我这种实验性网站来说,意义并不是很大。
全文检索:尝试了全文检索里面的比较潮的couchbaseredissearch、elasticsearch,最后选定elasticsearch,另外两个的速度虽然远高于elasticsearch,但毕竟是内存式数据库,简单功能尚可,复杂度上去后则吃内存太多。

制作过程呢?

下面我分享下大概过程,涉及到复杂原理,请自行谷歌,我不认为我可以把复杂原理描述的很简单。

关于命名:

从手中的十来个域名选择了

btzhai.top

中国国内同名的网站有几个,但是这不是问题。

关于服务器:

几经周折,购买了一台美国服务器。配置是:E5-1620|24G|1TB|200M带宽,真正的24小时人工服务。考虑到要用cloudfare,所以不需要硬防。一月1200RMB。

在此期间尝试了很多家服务器,深感这免备案服务器这一行真的是泥沙俱下。

关于爬虫:

大约8月初终于有空来着手bt搜索引擎这件事情。

首先摆在我面前的问题就是数据来源问题,要知道所谓的dht网络,说白了就是一个节点既是服务器又是客户端,你在利用dht网络下载时会广播到网络中,别的节点就会接收到你所下载文件的唯一标识符infohash(有的地方称之为神秘代码)和metadata,这里面包括了这个文件的名称、大小、创建时间、包含文件等信息,利用这个原理,dht爬虫就可以收集dht网络中的即时热门下载。

如果仅仅依靠依靠dht爬虫去爬的话,理论上初期速度大约为40w一天,30天可以收集上千万,但是dht网络里面的节点不可能总是下载新的文件,现实情况是:大多数情况下冷门的种子几年无人问津,热门种子天天数十万人下载。可以推想,随着种子基数增加,重复的infohash会越来越多,慢慢地只会增加所谓的种子热度而不会增加基数,但是没有1000w+的种子,从门面上来讲不好看。

去哪里弄1000w种子成了当时我主要研究的问题。首先我从github上选取了几个我认为比较好用的dht爬虫进行改造,让之可以直接将数据入库到elasticsearch中,并且在infohash重复的时候自动对热度+1。

elasticsearch的mapping如下,考虑到中文分词,选用了smartcn作为分词器,当然ik也是可以的。种子内的文件列表files,本来设置为nested object,因为nested query性能不高已经取消:

{
   
	"properties": {
   
		"name": {
   
			"type": "text",
			"analyzer": "smartcn",
			"search_analyzer": "smartcn"
		},
		"length": {
   
			"type": "long"
		},
		"popularity": {
   
			"type": "integer"
		},
		"create_time": {
   
			"type": "date",
			"format": "epoch_millis"
		},
		"files": {
   
			"properties": {
   
				"length": {
   
					"type": "long"
				},
				"path": {
   
					"type": "text",
					"analyzer": "smartcn",
					"search_analyzer": "smartcn"
				}
			}
		}
	}
}

服务器上开始24小时挂着dht爬虫。期间我也尝试过多种不同语言的开源爬虫来比较性能,甚至还找人试图购买bt种子。下面这些爬虫我都实际使用过:
https://github.com/shiyanhui/dht
https://github.com/fanpei91/p2pspider
https://github.com/fanpei91/simDHT
https://github.com/keenwon/antcolony
https://github.com/wenguonideshou/zsky
然而这些dht爬虫经试验,或多或少都有些问题,有的是只能采集infohash而不能采集metadata,有的采集速度不够,有的则随时间增加资源占用越来越大。

最终确定的是这个最优解:

https://github.com/neoql/btlet

唯一不妥是运行一段时间(

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
作为最早在国内研究和实践DHT爬虫的人,我的灵感是来自芬兰Helsinki大学的这篇论文: Real-World Sybil Attacks in BitTorrent Mainline DHT 英文好的同学应该很容易读懂,跟我写的不到300行的爬虫代码大致原理一样。初次接触DHT网络的可以结合我之前的文章阅读,或者拜读Kevin Lynx的博客。所以具体原理在这里就不再阐述了。 手撕包菜一开始只是为了纯粹的技术研究,没有去想这个搜索引擎能给网民带来什么样的福利。当时采集了大量的数据,发现有一半以上的资源为限级内容,于是试图去对资源进行分类并且做了很多这方面的工作。譬如,基本上能通过一套规则能筛选出限级内容,对资源进行分类,如果是视频还能匹配出是哪一部影片。可惜,这些工作我主观上认为对生活应用并没有太大价值,于是就放弃了深入的研究。或许是因为网民使用此类搜索引擎大部分都是具有明显的目的性。 手撕包菜经历了多次点技术变更开源版本使用了django网站框架重写,之前是Flask,再早期是tornado。电影FM也是使用tornado,后来发现tornado并不适用于任何场景。以内容为王的网站还是django比较擅长,只是入门时间比其他框架都较长。早期数据库采用了MongoDB,因为配合Python读写数据很方便,也不用关注数据结构,搜索功能采用自带的关键词搜索,不过后来随着资源数量增加,性能也明显跟不上。今年换了WiredTiger引擎,自带的fulltext search还是不给力。另外Amazon的cloudsearch是个坑,土豪可以考虑,性能真的很不错,就是比较贵。最后还是搭建一个SphinxSearch吧,数据库也换成MySQL(MyISAM引擎),配合起来也很方便。Sphinx创建全文索引的速度很给力,官方的自评也很高,我自己测试1000w的资源(大概3GB),1分钟左右就索引完毕。不信,大家可以自测一下。 标签:ssbc
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值