接触Elasticsearch

这是Web搜索这门选修课的第二个作业,将之前爬虫爬下来的数据插入Elasticsearch建立索引。在这个过程中算是对Elasticsearch和Kibana有了初步的认识,与es交互使用的是Python 的api(因为助教给的样例就是用Python。。。)。现在回过头看感觉这个作业其实并没什么任务量,但还是简要记录一下,也算记录生活吧。

我看了看自己的时间记录,好像是一星期前开始接触。当时第一天装Elasticsearch就遇到了问题,有如下报错,java和javac都没问题,echo了环境变量地址也显示正常。网上到处找方法试,最后注意到自己的环境变量JAVA_HOME引用JAVA11_HOME(因为之前本来想在电脑上保留两个Java版本,为了便于管理就采用了这个写法),然后试着改成直接写地址就没问题了。估计是那个运行文件写的不太行,这也为以后找问题提供了个思路,看看环境变量是不是有引用。

接下来两三天就偶尔看了下相关的资料,大概了解了Elasticsearch的基本概念,主要看的是这个: https://zhuanlan.zhihu.com/p/104215274 ,很全面,而且目前来看里面的内容没有过时。另外还有 https://cuiqingcai.com/6214.html ,主要是讲Python api的。这里顺便吐槽一下助教给的第二次作业的辅导材料,给的代码有点过时,还在用type,甚至还在用string类型。type在7.X开始不支持了 (现在网上很多教程都还没改过来) ,string类型在5.x以后就不支持了。当时我刚装完es啥也不懂的时候就去跑助教代码,一直报错,折腾了挺久的,最后放弃了,直接去看其他材料。这里简单记录下es的基础知识吧(主要搬自 https://www.ruanyifeng.com/blog/2017/08/elasticsearch.html ):

Elastic 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。每个索引有自己的 Mapping 用于定义文档的字段名和字段类型,类似于关系型数据库中的schema。每个索引有自己的 Settings 用于定义不同的数据分布,也就是索引使用分片的情况。Shard(分片)是物理空间概念,索引中的数据都分布在分片上。
Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。文档是所有可搜索数据的最小单位,类似关系数据库中某张表中的一行记录。文档会被序列化成 JSON 格式,JSON 对象由Field(字段)组成。每个字段都有对应的字段类型,类型可以自己指定,也可以使用 ElasticSearch 自动推算。每个文档都有一个唯一性 ID,可以自己指定,也可以系统自动生成。
自顶向下:Elasticsearch -> Index   -> Document -> Field

再接下来两三天重写了爬虫,之前爬寄托天下只爬了标题等信息,没爬文本,然后就完善了一下,爬完了cs,ee,math板块的所有帖子,大概1,6000条数据。

然后时间就来到了前三天。开始把数据插入到es中,用的是Python api 一条条的插。这里又遇到些坑爹的事。导入数据时一定要注意好格式。NaN要提前处理掉。时间要严格匹配,所有日期必须是两位的比如2020/4/14必须得是2020/04/14。若在es中是整数类型,导入的数字类型必须是Python自带的int类型,不能是numpy.int。当时自己也找了很久原因,一开始不知道int之间也有区别。。。在用astype把int8,int16等都试过一遍最后才搞清楚一定要用Python自带的int,否则会报如下错误:

而且,在dataframe中无论怎么换,始终都是numpy.int的数据类型,最后的解决方案是在一条条插数据时临时将每个元素用int()将其转为Python自带的int类型。

另外,插数据有个小插曲。刚开始lty同学提醒我插数据没那么快,我也做好了心理准备,准备挂着,结果一下就插完了。他百思不得其解,后来终于找到了原因,因为我用的是固态硬盘而他的是机械硬盘…..

插完数据后歇了一天,然后昨天开始着手优化排序结果和写报告。主要调了不同字段所占的权重(我的关键词是在标题、主贴、回帖三个字段中搜索),以及在评分中考虑受欢迎度和时间(主要参考了这篇博客及其引用的资料)。最后熬到很晚终于完结了报告。

这次的作业另外还有点感触,那就是要习惯去看程序的原版说明文档。之前自己总是会倾向于找中文材料,在这次过程中就暴露了些问题,es的更新变动挺多的,即使是es的中文社区的材料也很久没更新了。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注