Elastic Search中Document的CRUD操作

时间:2021-09-30 05:46:43

一、 新增Document
在索引中增加文档。在index中增加document。
ES有自动识别机制。如果增加的document对应的index不存在。自动创建,如果index存在,type不存在自动创建。如果index和type都存在,则使用现有的。

1.1 PUT语法
此操作为手工指定id的Document新增方式。
PUT /index_name/type_name/id{field_name:field_value}
如:

PUT /test_index/my_type/1
{
"name":"test_doc_01",
"remark":"first test elastic search",
"order_no":1
} PUT /test_index/my_type/2
{
"name":"test_doc_02",
"remark":"second test elastic search",
"order_no":2
} PUT /test_index/my_type/3
{
"name":"test_doc_03",
"remark":"third test elastic search",
"order_no":3
}

  

结果:

{
"_index": "test_index", 新增的document在什么index中,
"_type": "my_type", 新增的document在index中的哪一个type中。
"_id": "1", 指定的id是多少
"_version": 1, document的版本是多少,版本从1开始递增,每次写操作都会+1
"result": "created", 本次操作的结果,created创建,updated修改,deleted删除
"_shards": { 分片信息
"total": 2, 分片数量只提示primary shard
"successful": 1, 数据document一定只存放在index中的某一个primary shard中
"failed": 0
},
"_seq_no": 0, 执行的序列号
"_primary_term": 1 词条比对。
}

  

1.2 POST语法
此操作为ES自动生成id的新增Document方式。
语法:POST /index_name/type_name{fieldname:fieldvalue}
如:

POST /test_index/my_type
{
"name":"test_doc_04",
"remark":"forth test elastic search",
"order_no":4
}

注意:在ES中,一个index中的所有type类型的Document是存储在一起的,如果index中的不同的type之间的field差别太大,也会影响到磁盘的存储结构和存储空间的占用。如:test_index中有test_type1和test_type2两个不同的类型,type1中的document结构为:{"_id":"1","f1":"v1","f2":"v2"},type2中的document结构为:{"_id":"2","f3":"v3","f4":"v4"},那么ES在存储的时候,统一的存储方式是{"_id":"1","f1":"v1","f2":"v2","f3":"","f4":""}, {"_id":"2","f1":"","f2":"","f3":"v3","f4","v4"}、建议,每个index中存储的document结构不要有太大的差别。尽量控制在总计字段数据的10%以内。

二、 查询Document
2.1 GET查询
GET /index_name/type_name/id
如:

GET /test_index/my_type/1

结果:

{
"_index": "test_index",
"_type": "my_type",
"_id": "1",
"_version": 1,
"found": true,
"_source": { 找到的document数据内容。
"name": "test_doc_01",
"remark": "first test elastic search",
"order_no":1
}
}

  

2.2 GET _mget批量查询
批量查询可以提高查询效率。推荐使用(相对于单数据查询来说)。
语法:

GET /_mget
{
"docs" : [
{
"_index" : "value",
"_type" : "value",
"_id" : "value"
},{}, {}
]
} GET /index_name/_mget
{
"docs" : [
{
"_type" : "value",
"_id" : "value"
}, {}, {}
]
} GET /index_name/type_name/_mget
{
"docs" : [
{
"_id" : "value1"
},
{
"_id" : "value2"
}
]
}

  

三、 修改Document
3.1 替换Document(全量替换)
和新增的PUT语法是一致。
PUT /index_name/type_name/id{field_name:new_field_value}
要求新数据的字段信息和原数据的字段信息一致。也就是必须包括Document中的所有field才行。本操作相当于覆盖操作。全量替换的过程中,ES不会真的修改Document中的数据,而是标记ES中原有的Document为deleted状态,再创建一个新的Document来存储数据,当ES中的数据量过大时,ES后台回收deleted状态的Document(现阶段理解,后续课程中会详细说明)。
如:

PUT /test_index/my_type/1
{
"name":"new_test_doc_01",
"remark":"first test elastic search",
"order_no":1
}

 

结果:

{
"_index": "test_index",
"_type": "my_type",
"_id": "1",
"_version": 2,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 1,
"_primary_term": 1
}

  

3.2 PUT语法强制新增
如果使用PUT语法对同一个Document执行多次操作。是一种全量替换操作。如果需要ES辅助检查PUT的Document是否已存在,可以使用强制新增语法。使用强制新增语法时,如果Document的id在ES中已存在,则会报错。(version conflict, document already exists)
语法:
PUT /index_name/type_name/id/_create

PUT /index_name/type_name/id?op_type=create。
如:

PUT /test_index/my_type/1/_create
{
"name":"new_test_doc_01",
"remark":"first test elastic search",
"order_no":1
}

  

3.3 更新Document(partial update)
POST /index_name/type_name/id{field_name:field_value_for_update}
只更新某Document中的部分字段。这种更新方式也是标记原有数据为deleted状态,创建一个新的Document数据,将新的字段和未更新的原有字段组成这个新的Document,并创建。对比全量替换而言,只是操作上的方便,在底层执行上几乎没有区别。
如:

POST /test_index/my_type/1/_update
{
"doc":{
"name":" test_doc_01_for_update"
}
}

  

结果:

{
"_index": "test_index",
"_type": "my_type",
"_id": "1",
"_version": 5,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 2,
"_primary_term": 1
}

  

四、 删除Document
ES中执行删除操作时,ES先标记Document为deleted状态,而不是直接物理删除。当ES存储空间不足或工作空闲时,才会执行物理删除操作。标记为deleted状态的数据不会被查询搜索到。
ES中删除index,也是标记。后续才会执行物理删除。所有的标记动作都是为了NRT实现(近实时)。
DELETE /index_name/type_name/id
如:
DELETE /test_index/my_type/1
结果:

{
"_index": "test_index",
"_type": "my_type",
"_id": "1",
"_version": 6,
"result": "deleted",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 5,
"_primary_term": 1
}

  

五、 bulk批量增删改
使用bulk语法执行批量增删改。语法格式如下:
POST /_bulk
{ "action_type" : { "metadata_name" : "metadata_value" } }
{ document datas | action datas }
语法中的action_type可选值为:
create : 强制创建,相当于PUT /index_name/type_name/id/_create
index: 普通的PUT操作,相当于创建Document或全量替换
update: 更新操作(partial update),相当于 POST /index_name/type_name/id/_update
delete: 删除操作
案例如下:下述案例中将所有的操作语法分离了。可以一次性执行增删改的所有功能。最后的语法是批量操作语法。

POST /_bulk
{ "create" : { "_index" : "test_index" , "_type" : "my_type", "_id" : "1" } }
{ "field_name" : "field value" } POST /_bulk
{ "index" : { "_index" : "test_index", "_type" : "my_type" , "_id" : "2" } }
{ "field_name" : "field value 2" } POST /bulk
{ "update" : { "_index" : "test_index", "_type" : "my_type" , "_id" : 2", "_retry_on_conflict" : 3 } }
{ "doc" : { "field_name" : "partial update field value" } } POST /_bulk
{ "delete" : { "_index" : "test_index", "_type" : "my_type", "_id" : "2" } } POST /_bulk
{ "create" : { "_index" : "test_index" , "_type" : "my_type", "_id" : "10" } }
{ "field_name" : "field value" }
{ "index" : { "_index" : "test_index", "_type" : "my_type" , "_id" : "20" } }
{ "field_name" : "field value 2" }
{ "update" : { "_index" : "test_index", "_type" : "my_type" , "_id" : 20, "_retry_on_conflict" : 3 } }
{ "doc" : { "field_name" : "partial update field value" } }
{ "delete" : { "_index" : "test_index", "_type" : "my_type", "_id" : "2" } }

  

注意:bulk语法中要求一个完整的json串不能有换行。不同的json串必须使用换行分隔。多个操作中,如果有错误情况,不会影响到其他的操作,只会在批量操作返回结果中标记失败。bulk语法批量操作时,bulk request会一次性加载到内存中,如果请求数据量太大,性能反而下降(内存压力过高),需要反复尝试一个最佳的bulk request size。一般从1000~5000条数据开始尝试,逐渐增加。如果查看bulk request size的话,一般是5~15MB之间为好。
解释:bulk语法要求json格式是为了对内存的方便管理,和尽可能降低内存的压力。如果json格式没有特殊的限制,ES在解释bulk请求时,需要对任意格式的json进行解释处理,需要对bulk请求数据做json对象会json array对象的转化,那么内存的占用量至少翻倍,当请求量过大的时候,对内存的压力会直线上升,且需要jvm gc进程对垃圾数据做频繁回收,影响ES效率。
生成环境中,bulk api常用。都是使用java代码实现循环操作。一般一次bulk请求,执行一种操作。如:批量新增10000条数据等。

六、 Document routing 机制
ES对Document的管理有一个路由算法,这种算法决定了Document存放在哪一个primary shard中。算法为:primary shard = hash(routing) % number_of_primary_shards。其中的routing默认为Document中的元数据_id,也可以手工指定routing的值,指定方式为:PUT /index_name/type_name/id?routing=xxx。手工指定routing在海量数据中非常有用,通过手工指定的routing,ES会将相关联的Document存储在同一个shard中,方便后期进行应用级别的负载均衡并可以提高数据检索的效率。如:存电商中的商品,使用商品类型的编号作为routing,ES会把同一个类型的商品document数据,存在同一个shard中。查询的时候,同一个类型的商品,在一个shard上查询,效率最高。
如果是写操作。计算routing结果后,决定本次写操作定位到哪一个primary shard分片上,primary shard 分片写成功后,自动同步到对应replica shard上。如果是读操作,计算routing结果后,决定本次读操作定位到哪一个primary shard 或其对应的replica shard上。实现读负载均衡,replica shard数量越多,并发读能力越强。
PUT /test_index/my_type/10?routing=type_id{}

Elastic Search中Document的CRUD操作

七、 Document增删改原理简图

Elastic Search中Document的CRUD操作

解释:
1 : 客户端发起请求,执行增删改操作。所有的增删改操作都由primary shard直接处理,replica shard只被动的备份数据。此操作请求到节点2(请求发送到的节点随机),这个节点称为协调节点(coordinate node)。
2 : 协调节点通过路由算法,计算出本次操作的Document所在的shard。假设本次操作的Document所在shard为 primary shard 0。协调节点计算后,会将操作请求转发到节点1。
3 : 节点1中的primary shard 0在处理请求后,会将数据的变化同步到对应的replica shard 0中,也就是发送一个同步数据的请求到节点3中。
4 : replica shard 0在同步数据后,会响应通知请求这同步成功,也就是响应给primary shard 0(节点1)。
5 : primary shard 0(节点1)接收到replica shard 0的同步成功响应后,会响应请求者,本次操作完成。也就是响应给协调节点(节点2)。
6 : 协调节点返回响应给客户端,通知操作结果。

八、 Document查询简图

Elastic Search中Document的CRUD操作

解释:
1 : 客户端发起请求,执行查询操作。查询操作都由primary shard和replica shard共同处理。此操作请求到节点2(请求发送到的节点随机),这个节点称为协调节点(coordinate node)。
2 : 协调节点通过路由算法,计算出本次查询的Document所在的shard。假设本次查询的Document所在shard为 shard 0。协调节点计算后,会将操作请求转发到节点1或节点3。分配请求到节点1还是节点3通过随机算法计算,ES会保证当请求量足够大的时候,primary shard和replica shard处理的查询请求数是均等的(是不绝对一致)。
3 : 节点1或节点3中的primary shard 0或replica shard 0在处理请求后,会将查询结果返回给协调节点(节点2)。
4 : 协调节点得到查询结果后,再将查询结果返回给客户端。

Elastic Search中Document的CRUD操作的更多相关文章

  1. Elastic search中使用nested类型的内嵌对象

    在大数据的应用环境中,往往使用反范式设计来提高读写性能. 假设我们有个类似简书的系统,系统里有文章,用户也可以对文章进行赞赏.在关系型数据库中,如果按照数据库范式设计,需要两张表:一张文章表和一张赞赏 ...

  2. Elastic Search中filter的理解

    在ES中,请求一旦发起,ES服务器是按照请求参数的顺序依次执行具体的搜索过滤逻辑的.如何定制请求体中的搜索过滤条件顺序,是一个经验活.类似query(指search中的query请求参数),也是搜索的 ...

  3. Elastic Search对Document的搜索

    在ES中使用的重点.ES中存储的数据.核心就是为了提供全文搜索能力的.搜索功能非常重要.多练. 1 query string searchsearch的参数都是类似http请求头中的字符串参数提供搜索 ...

  4. Elastic Search中DSL Query的常见语法

    Query DSL是一种通过request body提交搜索参数的请求方式.就是将请求头参数(?xxx=xxx)转换为请求体参数.语法格式:GET [/index_name/type_name]/_s ...

  5. Elastic Search中normalization和分词器

    为key_words提供更加完整的倒排索引. 如:时态转化(like | liked),单复数转化(man | men),全写简写(china | cn),同义词(small | little)等. ...

  6. Elastic Search中Query String常见语法

    1 搜索所有数据timeout参数:是超时时长定义.代表每个节点上的每个shard执行搜索时最多耗时多久.不会影响响应的正常返回.只会影响返回响应中的数据数量.如:索引a中,有10亿数据.存储在5个s ...

  7. Elastic Search中mapping的问题

    Mapping在ES中是非常重要的一个概念.决定了一个index中的field使用什么数据格式存储,使用什么分词器解析,是否有子字段,是否需要copy to其他字段等.Mapping决定了index中 ...

  8. MongoDB的CRUD操作

    1. 前言 在上一篇文章中,我们介绍了MongoDB.现在,我们来看下如何在MongoDB中进行常规的CRUD操作.毕竟,作为一个存储系统,它的基本功能就是对数据进行增删改查操作. MongoDB中的 ...

  9. elastic search文档详解

    在elastic search中文档(document)类似于关系型数据库里的记录(record),类型(type)类似于表(table),索引(index)类似于库(database). 文档一定有 ...

随机推荐

  1. C++模板编程:如何使非通用的模板函数实现声明和定义分离

    我们在编写C++类库时,为了隐藏实现,往往只能忍痛舍弃模版的强大特性.但如果我们只需要有限的几个类型的模版实现,并且不允许用户传入其他类型时,我们就可以将实例化的代码放在cpp文件中实现了.然而,当我 ...

  2. 在已有 Ubuntu 的基础上硬盘安装 Win7 实现双系统

    . . . . . LZ 的笔记本电脑一直安装的是 Ubuntu 系统,最近由于工作需要,要安装一个 Win7 系统.大家都知道,Linux 和 Windows 装双系统的时候要先装 Win 再装 L ...

  3. Hadoop伪分布式搭建(一)

     下面内容主要说明在Windows虚拟机上面,怎么搭建一个Hadoop伪分布式,并如何运行wordcount程序和网页查看HDFS文件系统. 1 相关软件下载和安装 APACH官网提供hadoop版本 ...

  4. 替换Notes,K2 BPM为vivo打造新平台

    vivo是步步高旗下的分品牌,专注于智能手机领域,隶属于广东步步高工业电子有限公司.vivo追求乐趣.充满活力.年轻时尚的群体一起打造拥有卓越外观.专业级音质.极致影像.愉悦体验的智能产品,并将敢于追 ...

  5. 在mahout安装目录下输入mahout 提示 ERROR: Could not find mahout-examples-*.job

    错误:ERROR: Could not find mahout-examples-*.job in /home/grid/mahout-distribution-0.8 or /home/grid/m ...

  6. 【故障处理】ORA-30012的解决过程

    [故障处理]ORA-30012的解决过程 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O ...

  7. 多态VI的创建

    比较适合使用多态VI的场合:一个算法会应用到几种不同的数据类型上.比如读写 INI 文件的 VI,它 们既可以读写数值型的数据,也可以读写字符串.布尔等数据类型. 实现多态 VI 之前,一般先实现它的 ...

  8. Xcode的Hello World(简单易懂)

    http://www.cocoachina.com/industry/20131121/7392.html http://objccn.io/issue-6-3/

  9. 简易图书管理系统(主要是jsp的练习)

    1:首先设计用户表和图书表,设计的字段和类型如下图所示 1.1:用户表user 1.2:图书表book 2:第二写实体类user.java和book.java package com.bie.po; ...

  10. wall命令

    wall——发送广播信息 write all /usr/bin/wall 示例1: # wall 输入命令之后回车便可以广播消息,如输入Hello everybody online后Ctrl+D结束并 ...