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

版本更新知识: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"    
  }
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值