Elasticsearch Index API 参数详解

  • 1. index
    • 1.1 index作为名词
    • 1.2 index作为动词
  • 2. index的格式
    • 2.1 PUT和POST区别
      • 2.1.1 区别一
      • 2.1.2 区别二
    • 2.2 _create作用
  • 3. index的参数
    • 3.1 routing
      • 3.1.1 根据文档ID查找
      • 3.1.2 自定义路由
    • 3.2 timeout
    • 3.3 refresh
    • 3.3 version
    • 3.4 version_type
    • 3.5 if_seq_no & if_primary_term

1. index

1.1 index作为名词

index就像MySQL中表名,可以给index设置很多字段,并指定字段的类型(字符,数字,日期等)。之前老版本ES还可设置不同type,现在已去掉。

1.2 index作为动词

  • 作为动词,index就是往ES中写入的数据,类似MySQL的insert和update。
  • index操作把JSON文档写入ES,然后该JSON文档可被检索了。
  • 如果该文档已经存在(id相同),会修改该文档,然后version版本号+1。

2. index的格式

  • PUT /<index>/_doc/<_id>
  • POST /<index>/_doc/
  • PUT /<index>/_create/<_id>
  • POST /<index>/_create/<_id>

上面4个是index操作的格式,<index>和<_id>是参数位置。

  • <index> 填index的名称
  • <_id> 填文档的ID
  • _create是指定是新建文档操作。

PUT和POST的实例代码看我博客Elasticsearch笔记(一) Query DSL入门

2.1 PUT和POST区别

前面2个操作如下,可以看出PUT带了<_id>,而POST没有。

  • PUT /<index>/_doc/<_id>
  • POST /<index>/_doc/

2.1.1 区别一

  • 当想使用我们自己指定的ID时,需要用PUT。
  • 当想让ES给我们自动生成文档ID时,得用POST。

2.1.2 区别二

如果指定ID的文档已经存在时,PUT和POST有如下区别:

  • PUT是跟新整个文档,它先根据ID删除文档,然后再写入新文档。
  • POST是局部跟新文档,原来没有的字段会新增,已有的字段会修改。

2.2 _create作用

  • PUT /<index>/_create/<_id>
  • POST /<index>/_create/<_id>

上面的_create指定该操作是新建文档,如果参数<_id>的文档已经存在,则会返回操作失败。

3. index的参数

3.1 routing

在生产环境,一个index是被分为多个各分片的,路由机制和分片机制密切相关。
举例有一个index,它被分3个分片,每个分片各有一个副本。如下图

  • 主分片P0,P1,P2
  • 副分片R0,R1,R2


在index数据不指定routing时,ES默认用文档的ID来作为路由计算值,计算公式如下:

shard = hash(routing) % number_of_primary_shards

number_of_primary_shards是主分片数,这里就是3。对文档ID进行hash,再除以3,得到的余数肯定是0,1,2之间的数,对应主分片P0,P1,P2。这样起到了负载均衡的效果,使得每个分片里文档的数量理想情况下是几乎一样的。

举例ID=”abc“,shard = hash(“abc”) % 3 = 2,则把文档存到分片P2上。

3.1.1 根据文档ID查找

举例ID=”abc“,shard = hash(“abc”) % 3 = 2,则把这次查询发往分片P2上,因为插入时,ID=“abc”的数据就存在分片2上。这样就解释了index一旦创建好,主分片参数number_of_primary_shards是不能修改的,如果后期修改了它,查询时计算出的分片号和存入时分片号就不一致了。

3.1.2 自定义路由

如果不是根据文档ID查找,而是根据别的查询条件找,那默认是把请求发给所有的分片上,然后把每个分片的查询结果在协调节点上聚合,然后再给客户端最终结果。想想如果分片数很多,这样是很消耗系统系能的。
如果我们存数据时指定了路由routing参数,查询数据时也指定相同的routing参数,这样就会发给那一个分片,这样提高了查询效率,不用给每个分片发请求了。

PUT /pigg/_doc/100?routing=dept1
{"name": "winter","dept": "dept1"
}PUT /pigg/_doc/101?routing=dept1
{"name": "dong","dept": "dept1"
}查询时指定routing
GET /pigg/_search?routing=dept1
{"query": {"term": {"dept.keyword": {"value": "dept1"}}}
}

注意使用routing时,这个和业务数据是相关联的,一定要考虑到业务数据的特性。
例如routing=dept1的有10万条,routing=dept2的数据只有1千条,那么10万条数据在一个分片上,1千条数据在另一个分片上,这样导致了数据倾斜。

3.2 timeout

当index操作时,可能主分片不可用,例如此时主分片正在恢复中,或在重定向。这个时候index操作就得等待主分片可用,默认这个等待时间是1分钟,当然也可以自定义。

等待主分片10秒
PUT /pigg/_doc/102?timeout=10s
{"name": "dong2","dept": "dept1"
}

3.3 refresh

刚学ES时,都知道ES是一个近实时系统,写入的数据要约1秒后才能查询到。
refresh可以设置3种值,指定刷新行为。
ES的JavaAPI里定义了refresh的枚举如下:

public static enum RefreshPolicy implements Writeable {NONE("false"),IMMEDIATE("true"),WAIT_UNTIL("wait_for");//省略别的代码
}

它有false,true,wait_for三个值,ES默认是false。

(1)refresh = false
index后,不进行相关刷新操作,等待一定时间(约1秒),修改的数据可被查询到,ES默认这个。
(2)refresh = true

  • index后,立即刷新相关的主碎片和副本碎片(不是整个索引),以便可以立即搜索到修改后的文档。这样看着挺好,但是有不足的,否则ES也不会默认1S后可查询了。
  • 如果频率的执行refresh=true的操作,会生成很多小的段文件,这也会给后期段文件的合并增加处理时间,因而会影响搜索效率,这样就得不偿失。
  • 这个要谨慎考虑设置为true。

(3)refresh = wait_for
wait_for顾名思义,就是等待请求所做的更改被刷新可见。
对于在生产环境中,一般还是使用默认的配置refresh = false,很少有理由去设置refresh为别的,在技术选型时用ES了,也就得考虑到ES只是近实时,不是完全实时的。

3.3 version

每个文档都有一个版本号version,新增后version=1,以后每次修改,version自动加1,也可以指定version,比如让它从1一下子变成10这样。

#先新增一个ID=100的文档
PUT /pigg/_doc/100
{"name": "三爷"
}#返回结果如下,注意这个版本号_version=1
{"_index" : "pigg","_type" : "_doc","_id" : "100","_version" : 1,//注意这个版本号"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 1,"_primary_term" : 1
}

但我们要修改文档前,我们已经知道当前version=1,如果文档被别人修改过,那version肯定大于1。
当我们要修改时,带上version参数(值是我们认定的更新前,当前文档的version值),如果我们指定的与ES里文档相等,则能成功,否则报异常。

#指定跟新前文档现有version=1
PUT /pigg/_doc/100?version=1
{"name": "三爷2"
}#因为中间没有别人操作过id=100的文档,所以修改成功,version变成2
{"_index" : "pigg","_type" : "_doc","_id" : "100","_version" : 2,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 2,"_primary_term" : 1
}

3.4 version_type

在指定version参数时,我们还可以指定version_type参数。它有3种类型:

version_type 说明
internal 指定的version == 当前文档的version
external or external_gt 指定的version > 当前文档的version
external_gte 指定的version >= 当前文档的version
#指定了version_type=external,必须version>当前的version
PUT /pigg/_doc/100?version=10&version_type=external
{"name": "三爷3"
}#返回结果如下,version变成指定的10
{"_index" : "pigg","_type" : "_doc","_id" : "100","_version" : 10,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 4,"_primary_term" : 1
}

3.5 if_seq_no & if_primary_term

ES是乐观并发控制的,在ES6.7这个版本之前是用version+version_type,现在新版本的ES用if_seq_no & if_primary_term在做并发控制。
seq_no不是属于当个文档,它是属于整个index,这个和version不同,version是每个文档修改后都+1,每个文档的version相互不影响。
但是每个文档依旧有自己的seq_no值,更新一个文档时,还是用该文档的seq_no控制并发。
seq_no属于整个index,当index中任何文档修改或新增,seq_no都会+1。
例如id=1的文档创建后,seq_no=1,

那么id=2的文档创建后,seq_no=2,

再然后id=1的文档修改后,seq_no=3

再对id=2的文档修改,要并发控制,if_seq_no得=2

(1)创建文档获取_seq_no和_primary_term

PUT pigg/_doc/300
{"name": "winter"
}
返回结果如下,注意看最后2个_seq_no和_primary_term
{"_index" : "pigg","_type" : "_doc","_id" : "300","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 13,"_primary_term" : 1
}

(2)修改时带上if_seq_no&if_primary_term

PUT pigg/_doc/300?if_seq_no=13&if_primary_term=1
{"name": "winter1"
}
返回结果可见_seq_no加1了
{"_index" : "pigg","_type" : "_doc","_id" : "300","_version" : 2,"result" : "updated","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 14,//从13变成14了"_primary_term" : 1
}

(3)模拟并发操作

再次执行相同的操作
PUT pigg/_doc/300?if_seq_no=13&if_primary_term=1
{"name": "winter1"
}
返回报错,说seqNo已经是14了
{"error" : {"root_cause" : [{"type" : "version_conflict_engine_exception","reason" : "[300]: version conflict, required seqNo [13], primary term [1]. current document has seqNo [14] and primary term [1]","index_uuid" : "1EcXaVewTu2IFK_4OAGxIw","shard" : "0","index" : "pigg"}],"type" : "version_conflict_engine_exception","reason" : "[300]: version conflict, required seqNo [13], primary term [1]. current document has seqNo [14] and primary term [1]","index_uuid" : "1EcXaVewTu2IFK_4OAGxIw","shard" : "0","index" : "pigg"},"status" : 409
}

Elasticsearch教程(15) routing refresh version 参数详解相关推荐

  1. 调包侠福音!机器学习经典算法开源教程(附参数详解及代码实现)

    Datawhale 作者:赵楠.杨开漠.谢文昕.张雨 寄语:本文针对5大机器学习经典算法,梳理了其模型.策略和求解等方面的内容,同时给出了其对应sklearn的参数详解和代码实现,帮助学习者入门和巩固 ...

  2. 站长在线Python教程精讲:在Python函数中的关键字参数详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python函数中的关键字参数详解>.本文的主要内容有:关键字参数的含义和关键字参数的应用举例. 目录 1.关键字参数的含 ...

  3. 《HTTP/2基础教程》协议、特性、详解

    文章目录 <HTTP/2基础教程>协议.特性.详解 前言 第一章 HTTP进化史 第二章 HTTP/2 快速入门 第三章 Web优化"黑魔法"的动机与方式 HTTP/1 ...

  4. LNMP nginx1.4.6+php5.5.11+mysql5.6.17+mecache+opcache编译安装+opcache参数详解+opcache可视化php页面代码

    可能要用到的软件: libiconv-1.13.tar.gz  libmcrypt-2.5.8.tar.gz  mcrypt-2.6.8.tar.gz  mhash-0.9.9.9.tar.gz  m ...

  5. spring boot 实战 / 可执行war启动参数详解

    概述   上一篇文章<spring boot 实战 / mvn spring-boot:run 参数详解>主要讲解了spring boot 项目基于maven插件启动过程中借助profil ...

  6. pandas to_csv参数详解_【Python基础】Pandas数据可视化原来也这么厉害

    一.可视化概述 在Python中,常见的数据可视化库有3个: matplotlib:最常用的库,可以算作可视化的必备技能库,比较底层,api多,学起来不太容易. seaborn:是建构于matplot ...

  7. Celery参数详解、配置参数

    参数详解 Celery--Worker 准备: 安装 pip install celery easy_install celery 使用Redis作为Broker时 ,需安装 celery-with- ...

  8. Elasticsearch之settings和mappings(图文详解)

    Elasticsearch之settings和mappings的意义 简单的说,就是 settings是修改分片和副本数的. mappings是修改字段和类型的. 记住,可以用url方式来操作它们,也 ...

  9. 【Cartographer参数详解,调参,降低计算量调优笔记记录】

    Cartographer学习记录 文章目录 Cartographer学习记录 前言 一.cartographer参数详解 二..lua文件参数详解 1.rs16_2d_outdoor.lua 2.tr ...

  10. 【JY】YJK前处理参数详解及常见问题分析(一)

    点击蓝字  求求关注 [结构总体信息参数详解] A区参数详解 1.结构体系 结构体系的参数依据现行规范进行设定,直接影响模型的使用规范.限值计算方法.构件的指标统计.以及构件设计内容等,但不影响模型有 ...

最新文章

  1. 算法设计与分析python_Python算法设计与分析
  2. 全局照明算法基础——从辐射亮度到渲染方程
  3. uboot源码——环境变量
  4. 【英语学习】【Daily English】U03 Leisure Time L04 I need to squeeze in some time for reading
  5. mysql 创建唯一索引_Mysql普通索引和唯一索引的选择分析
  6. 13000.tcp服务器简易示例程序(linux)
  7. 测试用例设计之正交表设计
  8. 搜索和内容生态的关系
  9. 【爬虫】python爬取微信公众号
  10. pdf文档统计字数的问题
  11. 第三方支付龙头拉卡拉IPO过会
  12. 数据库DataBase
  13. LeeCode 108 递归
  14. 借鉴华为HiLink实现微信小程序智能配网功能
  15. 图形学 Lecture7 光线追踪
  16. 用python的opencv画出一棵树的骨架
  17. DeepFlow: Deep Learning-Based Malware Detection by Mining Android Application
  18. u-boot中nand相关命令使用---- ubi, ubifsls, ubifsmount, ubifsumount
  19. java doc 合并单元格_AsposeWords操作表格合并单元格
  20. CSS背景半透明效果

热门文章

  1. XSHELL 绝佳配色方案, 保护你的眼睛
  2. 【转】解决win10 VMware Workstation 与 Device/Credential Guard 不兼容 VMware Workstation 安装64位系统提示cpu不支持虚拟化
  3. html多媒体标签课件,HTML教程-公开课件.ppt
  4. DDR4技术原理详解
  5. [夏令营]——南理工夏令营随笔
  6. 基于Docker在Win10平台搭建Ruby on Rails 6.0框架开发环境
  7. 蓝旭后端第七次培训课 JDBC
  8. 数据结构 每日一练:编程
  9. Java内存略知一二
  10. 2023 新版视频通话照妖镜多模板