Elasticsearch系列---全面了解Document
概要
本篇主要介绍一下document的知识,对document的元数据和基本的语法进行讲解。
document核心元数据
前面入门实战一节有简单介绍过document数据示例,这次我们来详细了解一下它的核心元数据,查询响应报文如下:
{
"_index": "music",
"_type": "children",
"_id": "1",
"_version": 1,
"found": true,
"_source": {
"name": "gymbo",
"content": "I hava a friend who loves smile, gymbo is his name",
"language": "english",
"length": "75"
}
}
_index元数据
代表一个document存放在哪个index中,项目约定结构类似的数据放在一个索引,不同数据放不同索引里,所以同一个index中document结构基本是类似的,个别document多一个或少一个field,这样Elasticsearch对磁盘存储的利用率最高。
每个index有自己独立的shard存储文件,与其他index互不影响。
命名规范:名称小写,不能以'_', '-', 或 '+'开头。
_type元数据
ES 6.0.0之后一个index下面只能有一个type,最早指定是啥就是啥。
命名规范:可以用'_'开头,由于只有一个,官方示例上直接使用'_doc'。
_id元数据
document的唯一标识,与index一起唯一标识和定位一个document,可以手动指定,也可以由ES自动创建。
_version元数据
ES内部使用乐观锁对document的写操作进行控制,version版本号最初是1,更新操作成功后自动+1。
found元数据
document的搜索标志,成功是true,未搜索到是false。
_source元数据
里面是我们在新增时放在http request body的json串内容,是保存的业务数据,默认Get操作时,会原封不动地全部返回给客户端。
用Get命令搜索document时,可以定制返回的结果,在请求的_source中指定想要的field即可,示例命令:
GET /music/children/_search
{
"query": {
"match_all" : {}
},
"_source": ["name","content"]
}
document id
document的id手动指定与自动生成两种方式:
- 手动指定
PUT命令行指定ID时,即手动方式
PUT /music/children/id
- 自动生成
PUT命令行没指定ID时,此时ES会自动生成的id,长度为20个字符,URI安全,base64编码,GUID,保证不重复。
PUT /music/children
我们的项目中怎么选择ID生成方式呢?
一般来说,看Elasticsearch在系统里承担的角色,如果是业务系统,本身有关系型数据完成数据的落地,Elasticsearch的价值就是填补关系型数据的全文搜索的短板,Elasticsearch的数据源头,本身在带ID的,这种情况下应该使用手动指定ID的方式,直接用数据库存储数据的ID即可,后续的搜索功能,也很容易与数据库建立对应 关系。例如订单数据,此时的ID直接使用订单ID即可,而订单ID的生成方式,无论是自增ID,雪花ID,对Elasticsearch来讲都不要紧,保证唯一性即可。
而自动ID生成的场景,比如有些系统,它没有关系型数据库,Elasticsearch可能就是它唯一的数据落地方案,这种数据结构,ID没有太多的重要性,这时让Elasticsearch自动生成一个,可以保存到Elasticsearch即可。
tips: GUID、UUID、COMB概念
- UUID:是128位整数(16字节)的通用唯一识别码 (Universally Unique Identifier),它是由开放软件基金会(OSF)定义的一个软件建构的标准。
- GUID:是微软对UUID这个标准的实现。UUID还有其它各种实现,不止GUID一种。
- COMB(combine)型是数据库特有的一种设计思想,可以理解为一种改进的GUID,它通过组合GUID和系统时间,以使其在索引和检索时有更优的性能。
GUID与UUID的区别,生成的格式不同。
document写操作
- 强制创建
强制创建在语法上多了_create参数,或op_type=create,如
PUT /music/children/id/_create
或
PUT /music/children/id?op_type=create
强制创建与全量替换的异同点:
- 当ID不存在时,二者的效果一样。
- 当ID存在时,全量替换做更新操作,强制创建报错,提示"version conflict, document already exists"错误。
- 删除document
如果对一个document执行delete操作,ES不会立即进行物理删除,而是先标记为deleted状态,当文件数据变多满足一定条件后,ES再执行物理删除,类似于JVM的垃圾清理。
这个过程叫软删除,也叫lazy delete。
- 全量替换&增量更新
全量替换
全量替换命令可以多次执行,如果ID不存在,执行创建document操作,如果ID存在,执行更新,语法示例:
PUT /music/children/id
全量替换的原理:当全量替换请求发送到ES上时,会将该ID原有的document执行软删除,然后再新建一个document,把request body的内容存储到新的document中,后续的GET查询只关注非deleted状态的document,这样就完成了一次全量替换操作。
增量更新前必须保证该ID是存在的,存在执行更新操作,若不存在,抛出"document_missing_exception"错误信息。
增量更新
增量更新的原理,与全量替换基本一致,也有软删除过程,只是创建新的document时,需要将原有的document数据拷贝一份,再用增量的内容进行覆盖,得到一个新的document。
增量更新比全量替换的优点
- 查询修改写回操作,都发生在一个shard内部,网络带宽更小(有2次网络传输),大大提升了性能
- 减少了查询和修改中的时间时隔,可以有效减少并发冲突的情况(毫秒级的更新)
- 减轻应用程序拼接全量数据的工作量(如果json field比较多,拼接一个完整的document是很费事的)
小结
本篇主要围绕document的元数据进行了简单的讲解,希望可以加深对document的印象。
专注Java高并发、分布式架构,更多技术干货分享与心得,请关注公众号:Java架构社区

Elasticsearch系列---全面了解Document的更多相关文章
- Elasticsearch系列---简单入门实战
概要 本篇主要介绍一下Elasticsearch Document的数据格式,在Java应用程序.关系型数据库建模的对比,介绍在Kibana平台编写Restful API完成基本的集群状态查询,Doc ...
- Elasticsearch系列---并发控制及乐观锁实现原理
概要 本篇主要介绍一下Elasticsearch的并发控制和乐观锁的实现原理,列举常见的电商场景,关系型数据库的并发控制.ES的并发控制实践. 并发场景 不论是关系型数据库的应用,还是使用Elasti ...
- Elasticsearch 系列文章汇总(持续更新...)
系列文章列表 Query DSL Query DSL 概要,MatchAllQuery,全文查询简述 Match Query Match Phrase Query 和 Match Phrase Pre ...
- elasticsearch系列(一) 术语
elasticsearch(以下简称es)是一款开源的搜索引擎,基于apach lucene.最近在做nlp的时候顺便研究一下. 下面是官方列举的术语解释 Near Realtime 接近实时的查询, ...
- elasticsearch系列(三)分表分库
首先ES没有库和表的概念,只有index,type,document(详细术语可以看ES的系列一 http://www.cnblogs.com/ulysses-you/p/6736926.html), ...
- elasticsearch系列(五)score
概述 score在ES中有着很重要的作用,有了它才有了rank,是验证文档相关性的关键数据,score越大代表匹配到的文档相关性越大 官方解释 查询的时候可以用explain来展示score的计算过程 ...
- elasticsearch系列一:elasticsearch(ES简介、安装&配置、集成Ikanalyzer)
一.ES简介 1. ES是什么? Elasticsearch 是一个开源的搜索引擎,建立在全文搜索引擎库 Apache Lucene 基础之上 用 Java 编写的,它的内部使用 Lucene 做索引 ...
- elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)
一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...
- Elasticsearch系列(1):认识Elasticsearch
官方定义 Elasticsearch 是一个实时的分布式搜索分析引擎, 它能让你以一个之前从未有过的速度和规模,去探索你的数据. 它被用作全文检索.结构化搜索.分析以及这三个功能的组合. Elasti ...
随机推荐
- VS Code断点调试PHP超详细萌新教程
AppServ安装 1. 下载 2. 安装,一路默认设置顺便设置sql密码即可.这里建议不要修改端口,后续教程默认80端口. 3.点我测试,有下图则恭喜你AppServ安装完成. Xdebug配置 1 ...
- Spring中@Resource注解报错
描述:Spring框架中,@Resource注解报错,在书写时没有自动提示 解决方法:因为maven配置文件的pom.xml文件中缺少javax.annotation的依赖,在pom.项目路中加入依赖 ...
- zabbix清理监控历史mysql数据
问题描述: 今天同事说有个zabbix监控数据库历史数据越来越多了, 让我帮忙清一下,顺便熟悉练练手,做个笔记 zabbix监控运行一段时间以后,会留下大量的历史监控数据 zabbix数据库一直在增大 ...
- 数据后台管理(五)AOP日志
为了增加数据的安全性,在数据管理的过程中,我们需要将操作者访问时间,操作者的名称,访问的IP,访问资源的URL,执行时长,访问方法记录下来存储到数据库中,并可以通过页面查看. 1.将日志信息存储到数据 ...
- django & celery - 关于并发处理能力和内存使用的小结
背景 众所周知,celery 是python世界里处理分布式任务的好助手,它的出现结合赋予了我们强大的处理异步请求,分布式任务,周期任务等复杂场景的能力. 然鹅,今天我们所要讨论的则是如何更好的在使用 ...
- 机器阅读理解(看各类QA模型与花式Attention)
目录 简介 经典模型概述 Model 1: Attentive Reader and Impatient Reader Model 2: Attentive Sum Reader Model 3: S ...
- 数据仓库ETL案例学习(一)
来自课程案例学习 某跨国食品超市的信息管理系统,每天都会记录成千上万条各地连锁超市的销售数据.基于大数据的背景,该公司的管理层决定建立FoodMart数据仓库,期望能从庞大的数据中挖掘出有商业价值 ...
- Comet OJ - Contest #10 C题 鱼跃龙门
###题目链接### 题目大意: 给你一个 x ,让你求出最小的正整数 n 使得 n * (n + 1) / 2 % x == 0 ,即 n * (n + 1) % 2x == 0 . 分析: 1 ...
- 一个ip, 两个域名, 两个ssl, 访问多个不同的项目
在前面一篇中说过, 入了好几个坑. 后来使用了nginx+tomcat配置的方式. 终于成功了. 因为头一次使用nginx, 不知道具体怎么操作, 于是我在操作的时候, 按照以下几个步骤执行的: 导航 ...
- nyoj 822-画图 (*)
822-画图 内存限制:64MB 时间限制:1000ms 特判: No 通过数:133 提交数:187 难度:0 题目描述: 计算机画图也挺有趣的哈!那我们就来用计算机画幅图吧... 输入描述: 输入 ...