一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储


  想查数据,就免不了搜索,而搜索离不开搜索引擎。百度、谷歌都是非常庞大、复杂的搜索引擎,它们几乎索引了互联网上开放的所有网页和数据。然而对于我们自己的业务数据来说,没必要用这么复杂的技术。如果我们想实现自己的搜索引擎,为了便于存储和检索,Elasticsearch 就是不二选择。它是一个全文搜索引擎,可以快速存储、搜索和分析海量数据。

  所以,如果我们我们将爬取到的数据存储到 Elasticsearch 里面,那将会非常方便检索。

1. Elasticsearch 介绍

  Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。

  那 Lucene 又是什么呢?Lucene 可能是目前存在的(不论开源还是私有的)拥有最先进、高性能和全功能搜索引擎功能的库,但也仅仅只是一个库。要想用 Lucene,我们需要编写 Java 并引用 Lucene 包才可以,而且我们需要对信息检索有一定程度的理解。

  为了解决这个问题,Elasticsearch 就诞生了。Elasticsearch 也是使用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目标是使全文检索变得简单,相当于 Lucene 的一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。

  所以 Elasticsearch 仅仅就是一个简易版的 Lucene 封装吗?那就大错特错了,Elasticsearch 不仅仅是 Lucene,并且也不仅仅只是一个全文搜索引擎。它可以这样准确形容:

  • 一个分布式的实时文档存储,每个字段可以被索引与搜索;
  • 一个分布式实时分析搜索引擎;
  • 能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据。

  总之,它是一个非常强大的搜索引擎,维基百科、Stack Overflow、GitHub 都纷纷采用它来做搜索,不仅仅提供强大的检索能力,也提供强大的存储能力。

2. Elasticsearch 相关概念

  在 Elasticsearch 中有几个基本概念,如节点、索引、文档等,下面分别说明一下。理解了这些概念,对熟悉 Elasticsearch 是非常有帮助的。

  • 节点和集群

  Elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elasticsearch 实例。

  单个 Elasticsearch 实例称为一个节点(Node),一组节点构成一个集群(Cluster)。

  • 索引

  索引,即 Index,Elasticsearch 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
  所以,Elasticsearch 数据管理的顶层单位就叫作索引,其实就相当于 MySQL、MongoDB 等中数据库的概念。另外,值得注意的是,每个索引 (即数据库)的名字必须小写。

  • 文档

  文档,即 Document。索引里面单条记录称为文档,许多条文档构成了一个索引。同一个索引里面的文档,不要求有相同的结构(Schema),但是最好保持一致,因为这样有利于提高搜索效率。

  • 类型

  文档可以分组,比如 weather 这个索引里面,既可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫作类型(Type),它是虚拟的逻辑分组,用来过滤文档,类似 MySQL 中的数据表、MongoDB 中的 Collection。

  不同的类型应该有相似的结构。举例来说,id 字段不能在这个组中是字符串,在另一个组中是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如 products 和 logs)应该存成两个索引,而不是一个索引里面的两个类型(虽然可以做到)。

  根据规划,Elastic 6.x 版只允许每个索引包含一个类型,Elastic 7.x 开始将会将其彻底移除。

  • 字段

  每个文档都类似一个 JSON 结构,它包含了许多字段,每个字段都有其对应的值,多个字段组成了一个文档,其实就可以类比 MySQL 数据表中的字段。

  在 Elasticsearch 中,文档归属于一种类型(Type),而这些类型存在于索引中,我们可以画一些简单的对比图来类比传统关系型数据库:

Relational DB(库) -> Databases(库实例) -> Tables (表)-> Rows(行) -> Columns(列)
Elasticsearch(库) -> Indices (索引)  -> Types(类型)  -> Documents (文档)-> Fields(字段)

  以上就是 Elasticsearch 里面的一些基本概念,通过和关系型数据库的对比更加有助于理解。

3. 准备工作

  在开始本节实际操作之前,请确保已经正确安装好了 Elasticsearch,安装方式可以参考:https://setup.scrape.center/elasticsearch,安装完成之后确保其在本地 9200 端口上正常运行即可。

3.1 下载程序

Elasticsearch 下载地址
在这里插入图片描述
  这里用的是解压版,选第一个。

3.2 解压缩,配置文件修改

  解压到E盘,再打开bin目录,双击第二个批处理文件 elasticsearch.bat 启动 elasticsearch 服务。第一次启动时, 要注意此时的 ip 地址, 该 ip 地址会被绑定到 enrollment token 中, 在安装 Kibana 时有用。
在这里插入图片描述

  • 运行里面的elasticsearch.bat文件之后,出现如下内容:
    在这里插入图片描述

  • 这是第一次启动服务,里面有用户名和密码,需要复制下来保存。
    在这里插入图片描述

  • 再去地址栏输入127.0.0.1:9200,一直打不开,然后修改配置文件。路径是安装目录下的config文件夹,在里面找到文件elasticsearch.yml,然后右击用记事本打开。把下面两项修改一下。
    在这里插入图片描述

  • 至此,启动成功,图片如下:
    在这里插入图片描述

  • 此时,前面的cmd窗口一直开着,关掉的话,服务也就关掉了。所以,可以设置一下,放到后台服务中启动。添加系统环境变量 Elasticsearch_Server。
    在这里插入图片描述

  • 在系统环境变量 Path 中添加如下路径:
    在这里插入图片描述

  • 再在cmd窗口安装Elasicsearch服务。
    在这里插入图片描述

  • 最后,启动服务。
    在这里插入图片描述

  • 出现上面错误,解决办法为:找到elasticsearch-env.bat文件,还是用记事本打开,找到如下位置:
    在这里插入图片描述
    在这里插入图片描述

  • 最后重新注册服务,启动成功。
    在这里插入图片描述

  • 再学习几个命令。

    启动Elasticsearch服务:
    elasticsearch-service.bat start
    停止Elasticsearch服务:
    elasticsearch-service.bat stop
    安装Elasticsearch服务:
    elasticsearch-service.bat install
    卸载Elasticsearch服务:
    elasticsearch-service.bat remove
    启动 Elasticsearch 属性gui:
    elasticsearch-service.bat manager
    

  Elasticsearch 实际上提供了一系列 Restful API 来进行存取和查询操作,我们可以使用 curl 等命令或者直接调用 API 来进行数据存储和修改操作,但总归来说并不是很方便。所以这里我们就直接介绍一个专门用来对接 Elasticsearch 操作的 Python 库,名称也叫做 Elasticsearch,使用 pip3 安装即可:

pip3 install elasticsearch

  更详细的安装方式可以参考:https://setup.scrape.center/elasticsearch-py。安装好了之后我们就可以开始本节的学习了。

4. 创建索引

  我们先来看下怎样创建一个索引,这里我们创建一个名为 news 的索引:

from elasticsearch import Elasticsearch

es = Elasticsearch(
    "http://localhost:9200",   
    basic_auth=("elastic", "p1KSIzeKty-dXhzDAF38"),
    )
result = es.indices.create(index='news', ignore=400)
print(result)

  这里崔老师的例子,有错误提示,所以我用了上面的写法。注意:basic_auth里面是用户名和密码,这个在cmd命令窗口执行服务的时候,出现过,记得保存,放到这里面。
  上面创建Elasticsearch对象的格式如下:

es = Elasticsearch(
    ['https://[username:password@]hostname:port'],
    verify_certs=True, # 是否验证 SSL 证书
)

  第一个参数我们可以构造特定格式的链接字符串并传入,hostname 和 port 即 Elasticsearch 运行的地址和端口,username 和 password 是可选的,代表连接 Elasticsearch 需要的用户名和密码,另外而且还有其他的参数设置,比如 verify_certs 代表是否验证证书有效性。更多参数的设置可以参考:https://elasticsearch-py.readthedocs.io/en/latest/api.html#elasticsearch。

  声明 Elasticsearch 对象之后,我们调用了 es 的 indices 对象的 create 方法传入了 index 的名称,如果创建成功,会返回如下结果:

{
   'acknowledged': True, 'shards_acknowledged': True, 'index': 'news'}

  可以看到,其返回结果是 JSON 格式,其中的 acknowledged 字段表示创建操作执行成功。

  但这时如果我们再把代码执行一次的话,就会返回如下结果:

{
   'error': {
   'root_cause': [{
   
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山哥ol

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值