ES底层原理知识(无代码篇)

2023-11-13

版本更新知识:ES--删除映射类型-爱码网

1、Index索引,包含了一堆有相似数据结构的文档数据,一个索引包含很多document,一个索引就代表一类相似或者相同的document。索引简单来说就相对于关系型数据库的库。

2、Type类型,每个索引里可以有一个或者多个type,type是index的一个逻辑分类,例如建立电影的索引,电影可以分为多个type:科幻type、喜剧 type、魔幻type等等。每个type下的document中的field可能是不一样的。类型简单来说就相对于关系型数据库的表。

3、Document文档是信息的基本单元,一个document相当于一条数据,是可以被索引的,文档是以JSON的格式表现的。文档相对于关系型数据库的行。

4、Field字段,document由多个field组成,不同类型的document里面同名的field一定具有相同的类型。

5、setting设置,可以理解为管理这个index的一些重要属性的,比如分片(shard)和副本(replica),它决定这个索引库最终的配置形态。初学者的话,可以只用管这三个配置参数即可:

  • number_of_shards: 是设置的分片数,设置之后无法更改!

  • refresh_interval: 是设置es缓存的刷新时间,如果写入较为频繁,但是查询对实时性要求不那么高的话,可以设置高一些来提升性能。可以更改

  • number_of_replicas : 是设置该索引库的副本数,建议设置为1以上。

6、mapping映射,可以理解为关系型数据库的表结构,指定字段的类型。初学者可以先只用关心text、keyword、byte、short、integer、long、float、double、boolean、date这几个字段,其中text和keyword都是string类型,选择区分很简单,需要进行分词用text,不需要并且进行排序或聚合的可以用keyword。

7、shard分片,分片是一个单一的Lucene实例。这个是由Elasticsearch管理的比较底层的功能。索引是指向主分片和副本分片的逻辑空间。对于使用,只需要指定分片的数量,其他不需要做过多的事情。在开发使用的过程中,我们对应的对象都是索引,Elasticsearch会自动管理集群中所有的分片,当发生故障的时候,一个Elasticsearch会把分片移动到不同的节点或者添加新的节点。

  • 主分片(primary shard):每个文档都存储在一个分片中,当你存储一个文档的时候,系统会首先存储在主分片中,然后会复制到不同的副本中。默认情况下,一个索引有5个主分片。你可以在事先制定分片的数量,当分片一旦建立,分片的数量则不能修改。

  • 副本分片(replica shard):每一个分片有零个或多个副本。副本主要是主分片的复制,其中有两个目的:

    1、增加高可用性:当主分片失败的时候,可以从副本分片中选择一个作为主分片。 2、提高性能:当查询的时候可以到主分片或者副本分片中进行查询。默认情况下,一个主分配有一个副本,但副本的数量可以在后面动态的配置增加。副本必须部署在不同的节点上,不能部署在和主分片相同的节点上。

8、分片设置很重要!一个index指定了分片之后是无法修改的,因此在设置分片的时候一定要事前做好规划

9、ES的内存设置

由于ES构建基于lucene, 而lucene设计强大之处在于lucene能够很好的利用操作系统内存来缓存索引数据,以提供快速的查询性能。lucene的索引文件segements是存储在单文件中的,并且不可变,对于OS来说,能够很友好地将索引文件保持在cache中,以便快速访问;因此,我们很有必要将一半的物理内存留给lucene ; 另一半的物理内存留给ES(JVM heap )。所以, 在ES内存设置方面,可以遵循以下原则:

  1. 当机器内存小于64G时,遵循通用的原则,50%给ES,50%留给lucene。

  2. 当机器内存大于64G时,遵循以下原则:

a. 如果主要的使用场景是全文检索, 那么建议给ES Heap分配 4~32G的内存即可;其它内存留给操作系统, 供lucene使用(segments cache), 以提供更快的查询性能。

b. 如果主要的使用场景是聚合或排序, 并且大多数是numerics, dates, geo_points 以及not_analyzed的字符类型, 建议分配给ES Heap分配 4~32G的内存即可,其它内存留给操作系统,供lucene使用(doc values cache),提供快速的基于文档的聚类、排序性能。

c. 果使用场景是聚合或排序,并且都是基于analyzed 字符数据,这时需要更多的 heap size, 建议机器上运行多ES实例,每个实例保持不超过50%的ES heap设置(但不超过32G,堆内存设置32G以下时,JVM使用对象指标压缩技巧节省空间),50%以上留给lucene。

10、查询优化

  1. query_string 或 multi_match的查询字段越多, 查询越慢。可以在mapping阶段,利用copy_to属性将多字段的值索引到一个新字段,multi_match时,用新的字段查询。

  2. 日期字段的查询, 尤其是用now 的查询实际上是不存在缓存的,因此, 可以从业务的角度来考虑是否一定要用now, 毕竟利用query cache 是能够大大提高查询效率的。

  3. 查询结果集的大小不能随意设置成大得离谱的值, 如query.setSize不能设置成 Integer.MAX_VALUE, 因为ES内部需要建立一个数据结构来放指定大小的结果集数据。

  4. 尽量避免使用script,万不得已需要使用的话,选择painless & experssions 引擎。一旦使用script查询,一定要注意控制返回,千万不要有死循环,因为ES没有脚本运行的超时控制,只要当前的脚本没执行完,该查询会一直阻塞。

11、正排索引与倒排索引

  • 正排索引

    正排索引使用文档ID作为索引,记录每个次出现的次数与在该文档中的位置,优点是构建索引时较快,缺点是查询时较慢。

7ec9f8d96a6cf1470ec8888407103034.png

  • 倒排索引

    倒排索引使用文档中的词作为索引,记录每个词在哪个文档的哪个位置,优点是查询非常快,缺点是构建索引较慢。

12、 什么是动态映射

动态映射时Elasticsearch的一个重要特性: 不需要提前创建iindex、定义mapping信息和type类型, 你可以 直接向ES中插入文档数据时, ES会根据每个新field可能的数据类型, 自动为其配置type等mapping信息, 这个过程就是动态映射(dynamic mapping),说明: 动态映射虽然方便, 可并不直观, 为了个性化自定义相关设置, 可以在添加文档之前, 先创建index和type, 并配置type对应的mapping, 以取代动态映射.

true | false    boolean
1234            long
123.4            float
2018-10-10        date
"hello world"    text
12345

13、开启dynamic mapping动态映射策略

  • 约束策略

策略 功能说明

true 开启 —— 遇到陌生字段时, 进行动态映射

false 关闭 —— 忽略遇到的陌生字段

strict 遇到陌生字段时, 作报错处理

映射策略设置在properties同一层,默认最外层的dynamic是开启的,如果内层的properties没有定义dynamic,默认用外层的。

14、开启dynamic mapping动态映射策略

  • date_detection - 日期识别策略

对于date类型的数据, Elasticsearch有其默认的识别策略, 比如"yyyy-MM-dd". 存在这种情况:

① 第一次添加文档时, 某个field是类似"2018-01-01"的值, 其类型就动态映射成date; ② 后期再次添加文档, 该field是类似"hello world"的值, ES就会因为类型不匹配而报错.

为解决这一问题, 可以手动关闭某个type的date_detection; 如果不需要关闭, 建议手动指定这个field为date类型. 示例如下:

PUT blog_user/_mapping/_doc
{
    "date_detection": false
}

15、在type中自定义动态映射模板

(1) 在type中定义动态映射模板(dynamic mapping template) —— 把所有的String类型映射成text和keyword类型:

先删除已有的blog_user索引: DELETE blog_user, 再执行下述命令:

PUT blog_user
{
    "mappings": {
        "_doc": {
            "dynamic_templates": [
                {
                    "en": {       // 动态模板的名称
                        "match": "*_en",           // 匹配名为"*_en"的field
                        "match_mapping_type": "string",
                        "mapping": {
                            "type": "text",        // 把所有的string类型, 映射成text类型
                            "analyzer": "english", // 使用english分词器
                            "fields": {
                                "raw": {
                                    "type": "keyword",
                                    "ignore_above": 256
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}

这里的match_mapping_type的类型支持 [object, string, long, double, boolean, date, binary], 若使用text将抛出错误信息。

16、[过期]在index中自定义默认映射模板 _default mapping - 默认映射模板是类似于全局变量的存在, 对当前配置的索引起作用.

默认映射模板在Elasticsearch 6.x版本中已经不再支持, 因为6.0版本开始, 每个索引只能有一个类型, 因此默认模板没有存在的意义了.

17、ES分词器,之前我们创建索引,查询数据,都是使用的默认的分词器,分词效果不太理想,会把text的字段分成一个一个汉字,然后搜索的时候也会把搜索的句子进行分词,所以这里就需要更加智能的分词器IK分词器了。

ES内置了多种分词器,standard分词器是默认分词器,按词拆分、小写;simple分词器:按非字母拆分,小写,过滤非字母;wihtespace分词器:按空格分词。IK分词器是推荐较多的中文分词器,支持粗力度和细粒度分词,需要安装插件使用。

  1. 如果未安装ik分词器,那么,你如果写 "analyzer": "ik_max_word",那么程序就会报错,因为你没有安装ik分词器

  2. 如果你安装了ik分词器之后,你不指定分词器,不加上 "analyzer": "ik_max_word" 这句话,那么其分词效果跟你没有安装ik分词器是一致的,也是分词成每个汉字,和添加字段类型一个级别,每个字段都可以定义。

  3. 一些热词,自定义的词,ik是不会收录的,这时候我们需要自定义扩展。 比如:王者荣耀。 分词的效果如下,显然是不满足我们需求的,这时候就需要自定义。

18、ES生命周期 链接:ES索引的生命周期管理_没文化取名很难的博客-CSDN博客_es生命周期管理

ES索引的生命周期管理 介绍 ES可用于索引日志类数据,在此场景下,数据是源源不断地被写入到索引中。为了使索引的文档不会过多,查询的性能更好,我们希望索引可以根据大小、文档数量或索引已创建时长等指标进行自动回滚,可以自定义将超过一定时间的数据进行自动删除。ES为我们提供了索引的生命周期管理来帮助处理此场景下的问题。

索引的生命周期分为四个阶段:HOT->WARM->COLD->DELETE。

HOT为必须的阶段外,其他为非必须阶段,可以任意选择配置。在日志类场景下不需要WARN和COLD阶段,下文只配置了HOT与DELETE阶段。

PUT _ilm/policy/datastream_policy   
{
  "policy": {                       
    "phases": {
      "hot": {                      
        "actions": {
          "rollover": {             
            "max_docs" : 1
          }
        }
      },
      "delete": {
        "min_age": "30s",           
        "actions": {
          "delete": {}              
        }
      }
    }
  }
}

创建一个名为“datastream_policy“的策略,包含HOT和DELETE阶段。

  • HOT阶段:当日志索引文档数量超过1条时就会发生rollover。

  • DELETE阶段:超过30秒时执行删除。

另外,hot->actions->rollover还支持其他维度的控制,比如:

​
"max_size": "50GB"//最大容量
"max_age": "30d"//最大天数

​

配合配置索引模板使用:

PUT _template/datastream_template
{
  "index_patterns": ["datastream-*"],                 
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1,
    "index.lifecycle.name": "datastream_policy",   //引用周期策略名   
    "index.lifecycle.rollover_alias": "datastream"    
  }
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES底层原理知识(无代码篇) 的相关文章

随机推荐

  • c++基本使用--名字遮蔽与类作用域/继承的特殊关系

    名字遮蔽与类作用域 继承的特殊关系 名字遮蔽 基类的成员函数和派生类的成员函数不会构成重载 如果派生类有同名函数 那么就会遮蔽基类中的所有同名函数 类作用域 继承的特殊关系 名字遮蔽 基类的成员函数和派生类的成员函数不会构成重载 如果派生类
  • 【Leetcode刷题笔记之链表篇】142. 环形链表 II

    博客主页 大家好我叫张同学 欢迎点赞 收藏 留言 欢迎讨论 本文由 大家好我叫张同学 原创 首发于 CSDN 精品专栏 不定时更新 数据结构 算法 做题笔记 C语言编程学习 精品文章推荐 C语言进阶学习笔记 三 字符串函数详解 1 爆肝吐血
  • 如何在window快速安装Linux系统(虚拟机)

    软件名称 VMware17 0 0 安装环境 Win 11 虚拟机是指通过软件模拟的具有完整硬件系统功能的 运行在一个完全隔离环境中的完整计算机系统 虚拟机允许用户在当前操作系统中运行其他操作系统 虚拟操作系统会像电脑上的另一个程序一样运行
  • 算法导论 第六章 堆排序 习题6.5-8 k路合并排序

    请给出一个时间为O nlgk 用来将k个已排序链表合并为一个排序链表的算法 此处n为所有输入链表中元素的总数 提示 用一个最小堆来做k路合并 思路 利用有k个元素的最小堆有lgk的复杂度 所以堆的元素组成要每个链表的一个元素组成 具体步骤
  • 关于Flask框架中启动Scrapy爬虫框架时的几种问题的解决

    最近开发的爬虫调度系统是由Flask框架提供接口 在Flask中启动Scrapy项目 开发期间遇到了几个问题 网上找找 自己也琢磨了好久 终于顺利解决 问题如下 一 Scrapy crawl指令找不到 问题描述 先看一下我的项目结构 如下
  • javaWeb_09——HTTP响应、Response(输出,服务器路径,重定向,动态验证码,下载,不同浏览器的解码类)

    目录 今日内容 一 HTTP协议 1 请求消息 客户端发送给服务器端的数据 2 响应消息 服务器端发送给客户端的数据 二 Response对象 功能 设置响应消息 重定向 1 转发 重定向 特点 2 路径写法 3 服务器输出字符数据到浏览器
  • tensorflow -- tf.gfile

    tf gfile他是一个操作文件的模块 他吧os glob shutil 这几个对文件操作的功能整合到了一起去 Copy 从一个目录的文件拷贝到了另一个目录 同shutil copy DeleteRecursively 以递归方式删除dir
  • 一文读懂如何快速查询中科院JCR分区和汤森路透JCR分区

    作为一个学术渣 突然心血来潮 想搞明白困扰很久的中科院分区和汤森路透分区到底是咋回事 曾经听人忽悠某某杂志几区 IF多少 说的云里雾里 感觉自己白活了这么多年 你是不是也有这种感觉 要是有那就对了 不用担心 看完这篇文章 保证让你彻底摆脱搞
  • java中求时间间隔(精确到分钟)

    long nowTime System currentTimeMillis System out print 现在的时间是 nowTime SimpleDateFormat dateformat new SimpleDateFormat y
  • Maven项目中右边的maven Projects中子项目出现灰色

    如图所示 Maven项目中右方查看的Maven Projects中子项目出现灰色 原因 忽略了maven模块 解决方法 在idea中maven的setting中找到ignored files 看右边的面板中是否将变灰的maven模块忽略了
  • SD卡、TF卡读写速率测试

    请注意 可以在未经过博主同意下转载 但必须注明出处 谢谢 1 运行HDBENCH软件 点击确定 2 弹出如下图所示界面 配置选项并测试 选择待测TF卡 Removable可移动存储设备 图示所插入的TF卡是 I 盘 请根据实际情况选择 选择
  • Qt的D和Q指针

    Qt的D指针和Q指针 实际上就是一个类的成员指针变量 改变量指向另一个Private类对象 这个Private类对象中包含了一系列的成员和函数 这样做的目的 1 可以对外隐藏数据内容 2 防止改变类的数据模型 从而做到二进制兼容 Q DEC
  • 微信分享签名无效php_【求助】微信分享朋友圈失效

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 document ready function var islogin islogin val var area id sessionStorage getItem list area id v
  • 基于径向基神经网络的数据回归预测及matlab实现

    基于径向基神经网络的数据回归预测及matlab实现 径向基神经网络 Radial Basis Function Neural Network RBFNN 是一种常用的人工神经网络模型 其结构简单 学习速度快 精度高 并且具有良好的适应性 泛
  • Linux 离线升级 pip

    首先在一台有网的地方下载 pip3 download pip i http mirrors aliyun com pypi simple trusted host mirrors aliyun com 然后将这个pip xxx none a
  • 用JS获取小数点后两位数字方法

    1 最笨的办法 1 function get 2 3 var s 22 127456 4 var str s substring 0 s indexOf 3 5 alert str 6 2 正则表达式效果不错 1
  • win7下安装rhel7(redhat enterprise Linux 7) 双系统

    首先需要的材料是 win7 rhel7 ISO镜像 和 EasyBCD 然后将磁盘格出3个分区 卷标分别是 I RHEL7 J GEN 和K SWAP 要注意格出来的三个分区都是FAT32格式的 NTFS Linux不认 我分的大小是I 1
  • 如何使用万用表测量三级管的阻值

    1 三极管是含有两个PN结的半导体器件 根据两个PN结连接方式不同 可以分为NPN型和PNP型两种不同导电类型的三极管 测试三极管要使用万用电表的欧姆挡 并选择R 100或R 1k挡位 假定我们并不知道被测三极管是NPN型还是PNP型 也分
  • 你现在需要知道的 C# 10 的 5+1 特性

    距离 C 10 正式发布仅剩两个月 微软开启了关于其 C 语言第十版的新特性和功能的讨论 这些增强功能是在C 10 0 Preview 7 中宣布的 微软将在下一版 C 10 中实现的功能和改进如下 记录类型可以密封 ToString 现在
  • ES底层原理知识(无代码篇)

    版本更新知识 ES 删除映射类型 爱码网 1 Index索引 包含了一堆有相似数据结构的文档数据 一个索引包含很多document 一个索引就代表一类相似或者相同的document 索引简单来说就相对于关系型数据库的库 2 Type类型 每