mongo+ES视奸他的微博动态

0x00 写在前面

玩微博的都知道其实微博的搜索功能比较鸡肋,就算直接输入ID也未必能搜到什么有用的信息。如果想知道一个人在微博上的评论,回复怎么办?这段时间了解一些elasticsearch的知识,既然花了时间就要学以致用。

0x01 数据是基础

没有数据说什么都是耍流氓,用python爬微博的评论,为了节省开销,我这里利用的是 http://weibo.cn/,理想化的程度是全网爬(想想就可以了 = =,那么最大程度获取数据的方法就是目标化。

回到开始,我们的需求是特定目标的微博评论与回复,而这些内容90%出现在ta所关注的po主微博下(一个人基本只会给自己关注的博主评论),那么遍历ta的关注列表,只爬这些人的微博评论(这就已经是个不小的工程了。。。

1. 流程

2. 唯一微博标识(commentID)

commentID算是微博评论的唯一标识,后面的参数没有实在意义,利用这个commentID可以直接定位某条微博下的评论: http://weibo.cn/comment/{commentID}?page=n

3. 数据处理

  • redis集合去重
  • 存入mongo的字段是「是否二级评论」,「评论人」,「回复给who」,「评论正文」,「页数」,「commentID」

    {
    "_id" : ObjectId("58d1e2f6dce48a0eb14b5f2d"),
    "author" : "six个shell",
    "replyTo" : "@sixwhale",
    "text" : ":这是一条回复测试",
    "twice_comment" : true,
    "commentID" : "EADXk12c1",
    "page" : 1
    }


    {
    "_id" : ObjectId("58d1e4a7dce48a0eebfe559b"),
    "author" : "画小猜",
    "replyTo" : null,
    "text" : "新年快乐![干杯]西安娃[doge]",
    "twice_comment" : false,
    "commentID" : "EoGpxl4a4",
    "page" : 20
    }

0x02 为什么使用ES?

ES即elasticsearch,其实就是利用的ES的模糊匹配。数据库与搜索引擎的区别在于:

  • 数据库是「询问这篇文章是否匹配查询条件」
  • 搜索引擎是「这篇文章和查询的要求匹配程度如何」,即「相关性」

ES将每个字段的内容利用分词器分成单独的词,创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档,比较匹配程度,即相关性,计算出_score,按照降序全部检索出来。

0x03 mongoDB 与 ES 数据同步

我的环境:

  • mongo3.4.0
  • elasticsearch5.0.0
  • mongo-connector !!!
  • elastic2-doc-manager (文档管理器

同步之前确定27017,9200端口都正常服务

$ mongo-connector  --auto-commit-interval=0 -m 127.0.0.1:27017 -t  127.0.0.1:9200 -d elastic2_doc_manager  -n db.collection③

目前数据比较少,但是效果真的不错。。。

0x04 说明

① 相关性

  1. 检索词频率
  2. 反向文档频率:每个检索词在索引中出现的频率,频率越高,相关性越低
  3. 字段长度准则:检索词出现的字段的长度越大,相关性越低

② elastic2-doc-manager

  1. elasticsearch1.x pip install elastic-doc-manager
  2. elasticsearch2.x pip install elastic2-doc-manager[elastic2]
  3. elasticsearch5.x pip install elastic2-doc-manager[elastic5]

③ db.collection
指定数据库名db,集合名collection 默认情况是同步全部数据库,具体用法–help吧(= =