谁来跟我聊10毛钱的分布式全文搜索引擎——Elasticsearch

一、Elasticsearch简介

1.1 Elasticsearch是什么

Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。

1.2 什么是全文检索

1.2.1 结构化数据与非结构化数据

  • 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等
  • 非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等磁盘上的文件

1.2.2 搜索结构化数据和非结构化数据

  • 使用SQL语言专门搜索结构化的数据
  • 使用ES/Lucene/Solor建立倒排索引,根据关键字就可以搜索一些非结构化的数据

1.3 Elasticsearch特点

  • 分布式的搜索引擎和数据分析引擎
  • 全文检索,结构化检索,数据分析
  • 对海量数据进行近实时的处理

1.4 倒排索引结构

倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。
简单理解其实就是:正向索引是根据key找value,反向索引是根据value找key。
如下图所示,正向索引就是通过文档去找单词,反向索引就是通过单词去找文档。
在这里插入图片描述

二、分页搜索

在存在大量数据时,一般我们进行查询都需要进行分页查询。例如:我们指定页码、并指定每页显示多少条数据,然后Elasticsearch返回对应页码的数据。

2.1 浅分页

浅分页就是使用from和size来进行分页。在执行查询时,可以指定from(从第几条数据开始查起)和size(每页返回多少条)数据,就可以轻松完成分页。

from = (page – 1) * size
GET  /job_idx/_search
{
    "from": 0,
    "size": 5,
    "query": {
        "multi_match": {
            "query": "销售",
            "fields": ["title", "jd"]
        }·
    }
}

2.2 深分页

前面使用from和size方式,查询在1W-5W条数据以内都是OK的,但如果数据比较多的时候,会出现性能问题。Elasticsearch做了一个限制,不允许查询的是10000条以后的数据。如果要查询1W条以后的数据,需要使用Elasticsearch中提供的scroll游标来查询。在进行大量分页时,每次分页都需要将要查询的数据进行重新排序,这样非常浪费性能。使用scroll是将要用的数据一次性排序好,然后分批取出。性能要比from + size好得多。使用scroll查询后,排序后的数据会保持一定的时间,后续的分页查询都从该快照取数据即可。

三、Elasticsearch架构原理

3.1 Elasticsearch的节点类型

在Elasticsearch有两类节点,一类是Master,一类是DataNode。

3.1.1 Master节点

Master节点主要负责:

  • 管理索引(创建索引、删除索引)、分配分片
  • 维护元数据
  • 管理集群节点状态
  • 不负责数据写入和查询,比较轻量级

3.1.2 DataNode结点

在Elasticsearch集群中,会有N个DataNode节点。DataNode节点主要负责:

  • 数据写入、数据检索,大部分Elasticsearch的压力都在DataNode节点上

3.2 分片和副本机制

3.2.1 分片

  • Elasticsearch是一个分布式的搜索引擎,索引的数据也是分成若干部分,分布在不同的服务器节点中
  • 分布在不同服务器节点中的索引数据,就是分片(Shard)。Elasticsearch会自动管理分片,如果发现分片分布不均衡,就会自动迁移
  • 一个索引(index)由多个shard(分片)组成,而分片是分布在不同的服务器上的。

3.2.2 副本

  • 每个分片都会有一个Primary Shard(主分片),也会有若干个Replica Shard(副本分片)
  • Primary Shard和Replica Shard不在同一个节点上

3.2.3 指定分片和副本的数量

// 创建指定分片数量、副本数量的索引
PUT /job_idx_shard
{
    "mappings": {
        "properties": {
            "id": { "type": "long", "store": true },
            "area": { "type": "keyword", "store": true },
            "exp": { "type": "keyword", "store": true },
            "edu": { "type": "keyword", "store": true },
            "salary": { "type": "keyword", "store": true },
            "job_type": { "type": "keyword", "store": true },
            "cmp": { "type": "keyword", "store": true },
            "pv": { "type": "keyword", "store": true },
            "title": { "type": "text", "store": true },
            "jd": { "type": "text"}

        }
    },
    "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 2
    }
}
// 查看分片、主分片、副本分片
GET /_cat/indices?v

3.3 Elasticsearch重要工作流程

3.3.1 Elasticsearch文档写入原理

在这里插入图片描述

1、选择任意一个DataNode发送请求,例如:node2。此时,node2就成为一个 coordinating node(协调节点)。
2、计算得到文档要写入的分片shard = hash(routing) % number_of_primary_shards。routing 是一个可变值,默认是文档的 _id。coordinating node会进行路由,将请求转发给对应的primary shard所在的DataNode(假设primary shard在node1、replica shard在node2)
3、node1节点上的Primary Shard处理请求,写入数据到索引库中,并将数据同步到Replica shard。
4、Primary Shard和Replica Shard都保存好了文档,返回client。

3.3.2 Elasticsearch检索原理

在这里插入图片描述
1、client发起查询请求,某个DataNode接收到请求,该DataNode就会成为协调节点(Coordinating Node)。
2、协调节点(Coordinating Node)将查询请求广播到每一个数据节点,这些数据节点的分片会处理该查询请求。协调节点会轮询所有的分片来自动进行负载均衡。
3、每个分片进行数据查询,将符合条件的数据放在一个优先队列中,并将这些数据的文档ID、节点信息、分片信息返回给协调节点。
4、协调节点将所有的结果进行汇总,并进行全局排序
5、协调节点向包含这些文档ID的分片发送get请求,对应的分片将文档数据返回给协调节点,最后协调节点将数据返回给客户端。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值