我最开始在选用数据库时,为了不使用第三方库,打算使用erlang自带的mnesia。但是因为涉及到字符串匹配搜索,mnesia的查询语句在我看来太不友好,在经过一些资料查阅后就直接放弃了。利用DHT网络原理制作bt采集蜘蛛,开源版

然后我打算使用couchdb,因为它是erlang写的,而我正在用erlang写程序。第一次接触非关系型数据库,发现NoSQL数据库使用起来比SQL类的简单多了。但是在erlang里要使用couchdb实在太折腾了。我使用的客户端库是couchbeam。

因为couchdb暴露的API都是基于HTTP协议的,其数据格式使用了json,所以couchbeam实际上就是对各种HTTP请求、回应和json的包装。但是它竟然使用了ibrowse这个第三方HTTP客户端库,而不是erlang自带的。ibrowse又使用了jiffy这个解析json的库。这个库更惨烈的是它的解析工作都是交给C语言写的动态库来完成,我还得编译那个C库。

couchdb看起来不支持字符串查询,我得自己创建一个view,这个view里我通过翻阅了一些资料写了一个将每个doc的name拆分成若干次查询结果的map。这个map在处理每一次查询时,我都得动态更新之。couchdb是不支持局部更新的,这还不算大问题。然后很高兴,终于支持字符串查询了。这里的字符串查询都是基于字符串的子串查询。但是问题在于,太慢了。每一次在WEB端的查询,都直接导致erlang进程的call超时。

要让couchdb支持字符串查询,要快速,当然是有解决方案的。但是这个时候我已经没有心思继续折腾,任何一个库、程序如果接口设计得如此不方便,那就可以考虑换一个其他的。

我选择了mongodb。同样的基于文档的数据库。2.4版本还支持全文搜索。什么是全文搜索呢,这是一种基于单词的全文搜索方式。hello world我可以搜索hello,基于单词。mongodb会自动拆词。更关键更让人爽的是,要开启这个功能非常简单:设置启动参数、建立索引。没了。mongodb的erlang客户端库mongodb-erlang也只依赖一个bson-erlang库。然后我又埋头苦干,几个小时候我的这个爬虫程序就可以在浏览器端搜索关键字了。

后来我发现,mongodb的全文搜索是不支持中文的。因为它还不知道中文该怎么拆词。恰好我有个同事做过中文拆词的研究,看起来涉及到很复杂的算法。直到这个时候,我他妈才醒悟,我为什么需要基于单词的搜索。我们大部分的搜索其实都是基于子字符串的搜索。

于是,我将种子文件的名字拆分成了若干个子字符串,将这些子字符串以数组的形式作为种子文档的一个键值存储,而我依然还可以使用全文索引,因为全文索引会将整个字符串作为单词比较。实际上,基于一般的查询方式也是可以的。当然,索引还是得建立。

找了台服务器将磁力链接爬虫架设起来http://www.51bt.cc(51搜索)大家可以看下。相关推荐

  1. dht网络 kad协议 bencode编码 Java版 自给自足的磁力链接爬虫

    java 版本的实现 githbu地址 (求各位给几个start 小星星啦 拜谢) https://github.com/readmlll/dht-spider 1.导入idea 在入口类DhtNet ...

  2. 网络编程释疑之:单台服务器上的并发TCP连接数可以有多少

    曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了. 我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用 ...

  3. logstash接收多台服务器日志_Logstash实践: 分布式系统的日志监控

    1. 前言 服务端日志你有多重视? 我们没有日志 有日志,但基本不去控制需要输出的内容 经常微调日志,只输出我们想看和有用的 经常监控日志,一方面帮助日志微调,一方面及早发现程序的问题 只做到第1点的 ...

  4. linux两台服务器传输,Linux两台服务器之间高速数据传输命令:scp应用详解

    Linux两台服务器之间高速数据传输命令:scp应用详解 Linux scp命令用于Linux之间复制文件和目录到另外一台,这个命令在多台服务器之间传输还是非常有用的,速度也是非常快的.比window ...

  5. 使用erlang实现P2P磁力搜索-实现

    DHT网络本质上是一个用于查询的网络,其用于查询一个资源有哪些计算机正在下载.每个资源都有一个20字节长度的ID用于标示,称为infohash.当一个程序作为DHT节点加入这个网络时,就会有其他节点来 ...

  6. 5g网络技术目前怎么样?5g网络什么时候出?

    5g网络什么时候出呢?近日,5G成了一个比较热的话题.我国IMT-2020(5G)峰会不久前举办,<5G愿景和需求>白皮书也随之发布;2014亚洲移动通讯博览会上,贝尔实验室专家的话题就是 ...

  7. DHT网络原理制作bt采集蜘蛛,开源版

    dhtcrawler最早的版本有很多问题,修复过的最大的一个问题是关于erlang定时器的,在DHT实现中,需要对每个节点每个peer做超时处理,在erlang中的做法直接是针对每个节点注册了一个定时 ...

  8. Android中监听判断网络连接状态的方法

    这个python代码是用来从DHT网络(一种分布式的"磁力链接"的共享网络,这个叫法是我个人对这种分布式网络的称呼)中,检测收集"磁力链接".每一个磁力链接就对 ...

  9. 从世界杯观赛看,“移动视频”就是个伪命题

    世界杯,忙碌的一天从凌晨开始,随着裁判的一声哨响,移动视频应用们开始了辛苦的劳作,最先被打开的是直播应用,它们与真球迷度过了一个个精彩之夜:清晨时分,人挤人的地铁公交里,"伪球迷" ...

最新文章

  1. MySQL 8.0 新特性之统计直方图
  2. 为什么要在神经网络分类训练中使用 Cross-Entropy?(to be continued)
  3. 转://使用insert插入大量数据的总结
  4. c mysql 延时_Mysql 优化之延迟索引和分页优化
  5. 【开源】OSharp3.0框架解说系列(6.2):操作日志与数据日志
  6. 985 硕士待业200天,工作 10 年存款 2W : 累死你的不是工作,而是“选择”
  7. 电信基础设施共建共享
  8. 数据结构(严蔚敏版)与算法的实现(含全部代码)
  9. weblogic for linux 下载,weblogic for linux安装
  10. 网络安全实战之靶场渗透技术
  11. ant design 上传+自定义上传
  12. 2012年全国医院排名(转)
  13. 工程测量(建筑物施工、监测)
  14. Unity3d第一人称视角如何设置
  15. 什么是Oncall?
  16. linux系统下 blast,Linux下BLAST安装及BLAST使用
  17. 2022 Java 知识点总结
  18. 携程在线网页制作(flex布局)(静态页面)
  19. 自制表情包——python合成gif
  20. matplotlib的读书笔记

热门文章

  1. 线程池的五种状态详解
  2. 169高校毕业设计选题
  3. 麦克风指向性测试 效果图及声学转台资料
  4. Linux编辑器进制转换以及进制转换
  5. Axure之倒计时简单实现
  6. -1和255有什么区别?
  7. 英国人工智能简史:从艾伦图灵到DeepMind | 历程
  8. 数据可视化:数据可视化的意义
  9. 超详细的docker部署Web应用
  10. python语音合成需要的库_语音合成的几种方案实现与分析