收藏JAVA

Elasticsearch

2021-12-27  本文已影响0人  Alan1914

一、 ES是什么

1. 简介

Elaticsearch简称为ES,是一个开源的可扩展的分布式的全文检索引擎,它可以近乎实时的存储、检索数

据。本身扩展性很好,可扩展到上百台服务器,处理PB级别的数据。

2. 功能

3. 特点

Elasticsearch的特点是它提供了一个极速的搜索体验。这源于它的高速(speed)。相比较其它

的一些大数据引擎,Elasticsearch可以实现秒级的搜索,速度非常有优势。Elasticsearch的

cluster是一种分布式的部署,极易扩展(scale )这样很容易使它处理PB级的数据库容量。最重要

的是Elasticsearch是它搜索的结果可以按照分数进行排序,它能提供我们最相关的搜索结果

(relevance)

  1. 安装方便:没有其他依赖,下载后安装非常方便;只用修改几个参数就可以搭建起来一个集群
  2. JSON:输入/输出格式为 JSON,意味着不需要定义 Schema,快捷方便
  3. RESTful:基本所有操作 ( 索引、查询、甚至是配置 ) 都可以通过 HTTP 接口进行
  4. 分布式:节点对外表现对等(每个节点都可以用来做入口) 加入节点自动负载均衡
  5. 多租户:可根据不同的用途分索引,可以同时操作多个索引
  6. 支持超大数据: 可以扩展到 PB 级的结构化和非结构化数据 海量数据的近实时处理

4. 倒排索引

简单来说,通过value找key,适用于快速的全文搜索,一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表。

倒排索引创建索引的流程:

搜索的过程:

正向索引:通过key找value

5. 主流搜索方案

6. 版本

主流版本为5.x , 6.x及7.x版本

7.x 更新的内容如下

  1. 集群连接变化:TransportClient被废弃

    以至于,es7的java代码,只能使用restclient。对于java编程,建议采用 High-level-rest-

    client 的方式操作ES集群。High-level REST client 已删除接受Header参数的API方

    法,Cluster Health API默认为集群级别。

  2. ES数据存储结构变化:简化了Type 默认使用_doc

    es6时,官方就提到了es7会逐渐删除索引type,并且es6时已经规定每一个index只能有一个

    type。在es7中使用默认的_doc作为type,官方说在8.x版本会彻底移除type。

    api请求方式也发送变化,如获得某索引的某ID的文档:GET index/_doc/id其中index和id为具

    体的值

  3. ES程序包默认打包jdk:以至于7.x版本的程序包大小突然增大了200MB+, 对比6.x发现,包大了

    200MB+, 正是JDK的大小

  4. 默认配置变化:默认节点名称为主机名,默认分片数改为1,不再是5。

  5. Lucene升级为lucene 8 查询相关性速度优化:Weak-AND算法

    es可以看过是分布式lucene,lucene的性能直接决定es的性能。lucene8在top k及其他查询上有

    很大的性能提升。

    weak-and算法 核心原理:取TOP N结果集,估算命中记录数。

    TOP N的时候会跳过得分低于10000的文档来达到更快的性能。

  6. 间隔查询(Intervals queries): intervals query 允许用户精确控制查询词在文档中出现的先后关

    系,实现了对terms顺序、terms之间的距离以及它们之间的包含关系的灵活控制。

  7. 引入新的集群协调子系统 移除 minimum_master_nodes 参数,让 Elasticsearch 自己选择可以形

    成仲裁的节点。

  8. 7.0将不会再有OOM的情况,JVM引入了新的circuit breaker(熔断)机制,当查询或聚合的数据

    量超出单机处理的最大内存限制时会被截断。

    设置indices.breaker.fifielddata.limit的默认值已从JVM堆大小的60%降低到40%。

  9. 分片搜索空闲时跳过refresh

    以前版本的数据插入,每一秒都会有refresh动作,这使得es能成为一个近实时的搜索引擎。但是

    当没有查询需求的时候,该动作会使得es的资源得到较大的浪费。

7. 快速部署-单实例

# 创建网络,kibana 也接入这个网络
docker network create somenetwork

# 安装 es
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -v /home/search/es/data:/usr/share/elasticsearch/data -v /home/search/es/logs:/usr/share/elasticsearch/logs -e "discovery.type=single-node" elasticsearch:7.14.2

# Kibana 安装
docker run -d --name kibana --net somenetwork -p 5601:5601 kibana:7.14.2 

二、入门使用

1. 核心概念

关系型数据库(比如Mysql) 非关系型数据库(Elasticsearch)
数据库Database 索引Index
表Table 索引类型(原为Type)
数据行Row 文档Document
数据列Column 字段Field
约束 Schema 映射Mapping

2. API

Elasticsearch提供了Rest风格的API,即http请求接口,而且也提供了各种语言的客户端API。\

3. 集成IK分词器

IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。

K分词器有两种分词模式:ik_max_word和ik_smart模式。

拓展词典

停用词典

同义词典

4. 索引操作

5. 映射操作

6. 文档增删改查及局部更新

三、高级应用

1. 映射高级

地理坐标点数据类型-geo_point

字符串形式以半角逗号分割,如 "lat,lon"

对象形式显式命名为 lat 和 lon

数组形式表示为 [lon,lat]

过滤器 作用
geo_bounding_box 找出落在指定矩形框中的点
geo_distance 找出与指定位置在给定距离内的点
geo_distance_range 找出与指定点距离在给定最小距离和最大距离之间的点
geo_polygon 找出落在多边形中的点。 这个过滤器使用代价很大 。当觉得自己需要使用它,最好先看看 https://www.elastic.co/guide/cn/elasticsearch/guide/current/geo-shapes.html

6. 零停机索引重建

Elasticsearch是一个实时的分布式搜索引擎,为用户提供搜索服务,当我们决定存储某种数据时,在创

建索引的时候需要数据结构完整确定下来,与此同时索引的设定和很多固定配置将不能改变。当需要改

变数据结构时就需要重建索引,为此,Elasticsearch团队提供了辅助工具帮助开发人员进行索引重建。

方案一:外部数据导入方案

系统架构设计中,有关系型数据库用来存储数据,Elasticsearch在系统架构里起到查询加速的作用,如

果遇到索引重建的操作,待系统模块发布新版本后,可以从数据库将数据查询出来,重新灌到

Elasticsearch即可。

方案二:基于scroll+bulk+索引别名方案

利用Elasticsearch自带的一些工具完成索引的重建工作,当然在方案实际落地时,可能也会依赖客户端

的一些功能,比如用Java客户端持续的做scroll查询、bulk命令的封装等。数据完全自给自足,不依赖

其他数据源。

方案三:Reindex API方案

Elasticsearch v6.3.1已经支持Reindex API,它对scroll、bulk做了一层封装,能够 对文档重建索引而不

需要任何插件或外部工具。

7. Suggester智能搜索建议

Suggesters基本的运作原理是将输入的文本分解为token,然后在索引的字典里查找相似的term并返回。 根据使用场景的不同,Elasticsearch里设计了4种类别的Suggester,分别是:

8. Java Client

ES提供多种不同的客户端:

1、TransportClient ES提供的传统客户端,官方计划8.0版本删除此客户端。

2、RestClient RestClient是官方推荐使用的,它包括两种:Java Low Level REST Client和 Java High

Level REST Client。 ES在6.0之后提供 Java High Level REST Client, 两种客户端官方更推荐使用 Java

High Level REST Client, 使用时加入对应版本的依赖即可。

四、企业级高可用分布式集群

1. 核心概念

2. ES 的分布式架构

Elasticseasrch的架构遵循其基本概念:一个采用Restful API标准的高扩展性和高可用性的实时数据分

析的全文搜索引擎。

特性:

分层:

image.png

解析Elasticsearch的分布式架构

分布式架构的透明隐藏特性

Elasticsearch是一个分布式系统,隐藏了复杂的处理机制

拓容机制

reblance

主节点

主节点的主要职则是和集群操作的相关内容,如创建或删除索引,跟踪哪些节点是集群的一部分,并决

定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。

节点对等

每个节点都能接受请求,每个节点接受到请求后都能把该请求路由到有相关数据的其它节点上,接受原

始请求的节点负责采集数据并返回给客户端。

image.png

3. 集群环境搭建

4. 集群规划

1) 需要多大集群

从两个方面考虑:

推算的依据:

Elasticsearch JVM heap 最大可以设置32G 。

30G heap 大概能处理的数据量 10 T。如果内存很大如128G,可在一台机器上运行多个ES节点实例。

备注:集群规划满足当前数据规模+适量增长规模即可,后续可按需扩展。

两类应用场景:

2) 集群的节点角色如何分配

节点角色:

Master

node.master: true 节点可以作为主节点

DataNode

node.data: true 默认是数据节点

Coordinate node 协调节点,一个节点只作为接收请求、转发请求到其他节点、汇总各个节点返回数

据等功能的节点,就叫协调节点,如果仅担任协调节点,将上两个配置设为false。

说明:一个节点可以充当一个或多个角色,默认三个角色都有

节点角色如何分配:A. 小规模集群,不需严格区分。B. 中大规模集群(十个以上节点),应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,不互影响。如不会因协调角色负载过高而影响数据节点的能力。

3) 如何避免脑裂问题

什么是脑裂?

一个集群中只有一个A主节点,A主节点因为需要处理的东西太多或者网络过于繁忙,从而导致其他从节

点ping不通A主节点,这样其他从节点就会认为A主节点不可用了,就会重新选出一个新的主节点B。过

了一会A主节点恢复正常了,这样就出现了两个主节点,导致一部分数据来源于A主节点,另外一部分数

据来源于B主节点,出现数据不一致问题,这就是脑裂。

ES 如何解决?

常用做法(中大规模集群):

4) 索引应该设置多少分片

注意:分片数指定后不可变,除非重建索引、

分片设置的可参考原则:ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 推荐你最多分配7到8个分片。

在开始阶段, 一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片. 例如,如果你有3个节点,

则推荐你创建的分片数最多不超过9(3x3)个。当性能下降时,增加节点,ES会平衡分片的放置。

对于基于日期的索引需求, 并且对索引数据的搜索场景非常少. 也许这些索引量将达到成百上千, 但每个

索引的数据量只有1GB甚至更小. 对于这种类似场景, 建议只需要为索引分配1个分片。如日志管理就是

一个日期的索引需求,日期索引会很多,但每个索引存放的日志数据量就很少。

5) 分片应该设置多少副本

副本设置基本原则:

为保证高可用,副本数设置为2即可。要求集群至少要有3个节点,来分开存放主分片、副本。

如发现并发量大时,查询性能会下降,可增加副本数,来提升并发查询能力。

注意:新增副本时主节点会自动协调,然后拷贝数据到新增的副本节点,副本数是可以随时调整的!

PUT /my_temp_index/_settings 
{
  "number_of_replicas": 1 
}

五、数据模型构建

六、搜索实战

七、深度应用及原理剖析

1. 索引文档写入和近实时搜索原理

基本概念

上一篇 下一篇

猜你喜欢

热点阅读