ElasticStack学习(四):ElasticSearch文档使用与操作
一、文档的CRUD介绍
ElasticSearch中存在五种操作,分别如下:
1、Index
该操作表示:如果文档的ID不存在,则创建新的文档。若有相同的ID,先删除现有文档,然后再创建新的文档,同时版本会增加。
语法格式如下:
PUT index_name/_doc/100
{"field1":"value1","field2":"value2"}
其中,index_name【索引名称】,_doc【Type名称,约定都用_doc】,100【文档ID】
2、Create
该操作表示:创建新的文档,但是如果ID已经存在,会失败。
该操作支持两种操作方式:1)自动生成文档ID;2)指定文档ID;
语法格式如下:
根据文档ID,创建文档信息。(指定文档ID的方式)
PUT index_name/_create/100
{"field1":"value1","field2":"value2"}
或者
PUT index_name/_doc/100?op_type=create
{"field1":"value1","field2":"value2"}
若不指定文档ID,创建文档时会自动生成。(自动生成文档ID的方式)
POST index_name/_doc
{"field1":"value1","field2":"value2"}
3、Update
该操作表示:更新的文档必须存在,更新时只会对相应字段做增量修改。
语法格式如下:
POST index_name/_update/100
{
"doc":{"field1":"value1","field2":"value2"}
}
4、Delete
该操作表示:根据文档ID,对相应文档进行删除。
语法格式如下:
DELETE index_name/_doc/100
5、Read
该操作表示:根据文档ID,获取相应文档信息。
语法格式如下:
GET index_name/_doc/100
注意:Index操作相对于Create、Update操作的不同之处在于:如果文档不存在,Index就会创建新的文档。否则,如果文档存在,现有文档会被删除,新的文档会被创建,版本信息也会加1。而反观Create操作,如果具有相同文档ID的文档信息存在了,则不能创建新的文档,会报错;Update操作,如果发现有相同文档ID的信息,不会删除原来的文档,而是实现真正的数据更新,若没有发现相同的文档ID,则会报错。
二、文档CRUD操作实例
我们现在通过Kibana中的Dev Tools进行上述操作的演示:
1、Create操作
1)自动生成文档ID的方式

通过以自动生成文档ID的形式进行文档创建,会发现创建的文档ID是自动生成的,版本为1。
2)指定文档ID的方式

如果文档ID已经存在,则会报错,如下所示:

2、Read操作
通过给定相应文档ID,可以读取相应的文档信息,如下所示:


从读取出来的结果信息中可以发现,蓝色区域部分就是文档的metadata,包括索引的名称、类型、文档ID、版本等信息;红色区域部分就是文档的所有原始信息。
3、Index操作

通过执行Index操作,我们可以发现,version由1更改为2。同时通过读取文档ID为100的信息,会发现name变成了“张三”,而字段des已经不存在了。说明Index操作是先删除原有ID的文档记录,然后再创建一个相同ID的文档信息。
4、Update操作
因为上面在执行Index操作时,文档的Des字段已经不存在了,现在将这个字段增加到文档ID为100的文档上,此时就需要执行Update操作,如下所示:


读取文档信息后会发现,文档信息中新增加了”des"、"age"两个字段,同时版本号又增加了一次。
5、Delete操作

三、文档批量操作
1、Bulk API(批量操作)
Bulk API的作用:在访问网络API时,每一次的访问都需要重新建立网络开销,因此是非常损耗性能的。 而Bulk API的核心思想就是在一次Rest请求中,对不同索引执行多次操作。它支持四种操作类型:Index、Create、Update、Delete。


通过上图中实例操作,可以看出:
1)对于索引“users”执行index操作,返回成功;
2)对于索引"users"中,文档ID为2的文档信息进行删除,返回状态是404,结果是not_found,说明在索引“users”中并没有文档ID=2的文档信息;
3)对于索引"users"中,文档ID为2的文档信息进行更新,新增字段field2;
4)对于索引"shops"中,创建文档ID为1的文档信息;
在Bulk API操作中,若有单条操作失败,并不会影响其他操作。同时,返回结果包括了每一条操作执行的结果。
2、mget(批量读取)
mget与Bulk API的思路是一样的,都是为了减少网络连接所产生的开销,以提高性能。通过提供一系列的文档ID,在一次API请求中,就可以将所有的文档信息返回回来。

上图中,我们通过mget操作访问索引“users”中文档ID为“1”、“101”的文档信息,访问索引“shops”中文档ID为“1”的文档信息。其中两条均返回成功,而文档ID=101的文档信息没有找到。
3、msearch(批量查询)
msearch通过一次Rest访问,对不同的索引进行不同的查询。



通过上图中可以看出,此次批量查询一共执行了三段查询操作,第一次是针对索引users,查询文档ID大于等于1的文档信息,一共查询10条;第二次是查询索引users中所有的文档信息;第三条是查询索引shops中所有的文档信息。
四、常见错误返回说明及注意事项

1、对于Bulk API、mget、msearch等批量操作的API,通过调用它们可以很好的提高性能,但是在调用时也不要过多的发送数据,否则也会容易导致ES集群过大的压力,造成性能的下降。
那么过多的数据一般控制在多少为好呢?一般建议是1000-5000个文档,如果文档很大,可以适当减少队列,大小建议是5-15M,默认不能超过100M,否则会报错。
2、虽我们在执行CU操作,或者批量执行CU操作时,动态的向索引更新或者创建了字段。此时并没有对索引预先做mapping定义,但是ES也会根据文档类型进行类型推断,将新增的字段定义在mapping中。在生产环境中,建议做mapping设定后再写入数据。
3、mget与msearch的区别:mget是通过文档ID列表得到文档信息,msearch是根据查询条件,搜索到相关文档。
4、自创建文档ID时,需要考虑ID的均衡性,避免产生分配不均衡的问题。
大家可关注我的公众号
  
知识学习来源:《Elasticsearch核心技术与实战》
ElasticStack学习(四):ElasticSearch文档使用与操作的更多相关文章
- Elasticsearch入门教程(四):Elasticsearch文档CURD
		
原文:Elasticsearch入门教程(四):Elasticsearch文档CURD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...
 - elasticsearch文档-modules
		
elasticsearch文档-modules modules 模块 cluster 原文 基本概念 cluster: 集群,一个集群通常由很多节点(node)组成 node: 节点,比如集群中的每台 ...
 - Elasticsearch文档查询
		
简单数据集 到目前为止,已经了解了基本知识,现在我们尝试用更逼真的数据集,这儿已经准备好了一份虚构的JSON,关于客户银行账户信息的.每个文档的结构如下: { , , "firstname& ...
 - MongoDB学习笔记:文档Crud Shell
		
MongoDB学习笔记:文档Crud Shell 文档插入 一.插入语法 db.collection.insertOne() 将单个文档插入到集合中.db.collection.insertMan ...
 - elasticsearch 文档
		
elasticsearch 文档 文档格式 索引中最基本的单元叫做文档 document. 在es中文档的示例如下: { "_index": "questions&quo ...
 - elasticsearch文档-analysis
		
elasticsearch文档-analysis analysis 基本概念 全文搜索引擎会用某种算法对要建索引的文档进行分析, 从文档中提取出若干Token(词元), 这些算法称为Tokeniz ...
 - ElasticSearch文档操作介绍三
		
ElasticSearch文档的操作 文档存储位置的计算公式: shard = hash(routing) % number_of_primary_shards 上面公式中,routing 是一个可变 ...
 - ElasticSearch文档
		
1.什么是文档? 程序中大多的实体或对象能够被序列化为包含键值对的JSON对象,键(key)是字段(field)或属性(property)的名字,值(value)可以是字符串.数字.布尔类型.另一个对 ...
 - 关于Elasticsearch文档的描述以及如何操作文档的详细总结
		
文档 什么是文档 在大多数应用中,多数实体或对象可以被序列化为包含键值对的 JSON 对象. 一个 键 可以是一个字段或字段的名称,一个 值 可以是一个字符串,一个数字,一个布尔值, 另一个对象,一些 ...
 
随机推荐
- DataContext和ItemSource
			
一对多的关系DataContext为上下文,绑定数据源ItemSource取上下文中的某属性,会一级一级往上找属性 一般ItemSource的绑定,绑定到Grid/DataGrid一类容器上,底下的控 ...
 - 用树莓派和DS18B20做个汽车温度记录仪
			
原文:用树莓派和DS18B20做个汽车温度记录仪 用树莓派和DS18B20做个汽车温度记录仪[原创] 很想知道夏日阳光暴晒下,汽车内的最高温度以及温度的变化情况.觉得用树莓派和DS18B20来实现应该 ...
 - .Net Core 中使用PetaPoco ,T4生成模版
			
话不多说,直接上源码. 1.引用NuGet 2.添加T4 <#@ template debug="true" hostspecific="false" l ...
 - centos搭建svn服务器并同步到web目录
			
yum install subversion mkdir -v /root/svn cd /root/svn svnadmin create web cd web/conf/ vi passwd te ...
 - HTML5离线缓存攻击测试
			
本实验采用局域网模拟,通过修改本地HOSTS文件来模拟域名以及DNS欺骗.合法网站使用Linux CentOS7的apache服务器搭建,IP为192.168.1.113,HOSTS文件中加入192. ...
 - UWP中的消息提示框(一)
			
不管什么平台,应用内难免会出现一些消息提示框,下面就来聊聊我在UWP里用到的消息提示框. 弹窗也可按是否需要用户操作促发一些逻辑进行分为两大类. 不需要用户干涉的一类: MessageDialog:操 ...
 - EF  CodeFirst数据迁移与防数据库删除
			
1 开启migrations功能 enable-migrations -force 2 添加迁移版本 add-migration 名称后缀 我们每次修改实体后,都应该使用这个add-migration ...
 - 【码云周刊第 23 期】Web 高效开发必备的 PHP 框架(从这里学起)good
			
码云项目推荐 1.项目名称:多功能 THinkPHP 开源框架 项目简介:使用 THinkPHP 开发项目的过程中把一些常用的功能或者第三方 sdk 整合好,开源供亲们参考,如 Auth 权限管理.支 ...
 - 以太坊(ethereum)开发DApp应用的入门区块链技术教程
			
概述 对初学者,首先要了解以太坊开发相关的基本概念. 学习以太坊开发的一般前序知识要求,最好对以下技术已经有一些基本了解: 一种面向对象的开发语言,例如:Python,Ruby,Java... 前 ...
 - windows下Qt5.2 for android开发环境搭建
			
windows下Qt5.2 forAndroid开发环境配置 1.下载安装Qt 5.2.0 for Android (Windows 32-bit) http://qt-project.org/d ...