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手动指定与自动生成两种方式:

  1. 手动指定
    PUT命令行指定ID时,即手动方式

PUT /music/children/id

  1. 自动生成
    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写操作

  1. 强制创建
    强制创建在语法上多了_create参数,或op_type=create,如

PUT /music/children/id/_create

PUT /music/children/id?op_type=create

强制创建与全量替换的异同点:

  • 当ID不存在时,二者的效果一样。
  • 当ID存在时,全量替换做更新操作,强制创建报错,提示"version conflict, document already exists"错误。
  1. 删除document

如果对一个document执行delete操作,ES不会立即进行物理删除,而是先标记为deleted状态,当文件数据变多满足一定条件后,ES再执行物理删除,类似于JVM的垃圾清理。
这个过程叫软删除,也叫lazy delete。

  1. 全量替换&增量更新
全量替换

全量替换命令可以多次执行,如果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架构社区
可以扫左边二维码添加好友,邀请你加入Java架构社区微信群共同探讨技术

原文地址:https://blog.51cto.com/2123175/2486165

时间: 2024-11-04 17:19:35

Elasticsearch系列---全面了解Document的相关文章

Elasticsearch系列---简单入门实战

概要 本篇主要介绍一下Elasticsearch Document的数据格式,在Java应用程序.关系型数据库建模的对比,介绍在Kibana平台编写Restful API完成基本的集群状态查询,Document最基本CRUD操作示例以及bulk批处理示例. Document数据格式 Java应用系统的数据模型都是面向对象的,有些对象比较复杂,传统的业务系统,数据需要落地到关系型数据库,在数据库领域模型设计时,会把复杂的POJO对象设计成一对一或一对多的关系,进行扁平化处理,查询的时候,需要多表查

elasticsearch系列(一) 术语

elasticsearch(以下简称es)是一款开源的搜索引擎,基于apach lucene.最近在做nlp的时候顺便研究一下. 下面是官方列举的术语解释 Near Realtime 接近实时的查询,通常情况下,延迟在1s以内 Cluster 一个集群由1个或者多个节点组成,这些节点提供整个数据和索引,性能来源于每个节点.一个集群有一个唯一的名字,默认为"elasticsearch", Node 一个node启动的时候分配一个唯一的id(UUID),自动会加入名为"elast

elasticsearch系列(五)score

概述 score在ES中有着很重要的作用,有了它才有了rank,是验证文档相关性的关键数据,score越大代表匹配到的文档相关性越大 官方解释 查询的时候可以用explain来展示score的计算过程,也可以增加format=yaml来讲json转成yaml方便阅读 类似xxx/_search?explain&format=yaml 下图是通过explain看到的一部分json,其实这个解释中就展示出了计算公式,不得不说ES在这点上还是很人性化的 计算方式 常说的相关性是指计算一个全文(full

elasticsearch系列一:elasticsearch(ES简介、安装&配置、集成Ikanalyzer)

一.ES简介 1. ES是什么? Elasticsearch 是一个开源的搜索引擎,建立在全文搜索引擎库 Apache Lucene 基础之上 用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API. Elasticsearch 不仅仅只是一个全文搜索引擎. 它可以被下面这样准确的形容: 一个分布式的实时文档存储,每个字段可以被索引与搜索--作数据库用 一个分布式实

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 这种连接方式对应于架构图中的RESTful style API这一层,这种客户端的连接方式是RESTful风格的,使用http的方式进行连接 3.2 Transport 连接 端口 9300 这种连接方式对应于架构图中的Transport这一层,这种客户端连接方式是直接连接ES的节点,使用TCP的方式进行连接 4. ES提供了多种

elasticsearch系列一elasticsearch(ES简介、安装&配置、集成Ikanalyzer)

一.ES简介 1. ES是什么? Elasticsearch 是一个开源的搜索引擎,建立在全文搜索引擎库 Apache Lucene 基础之上 用 Java 编写的,它的内部使用 Lucene 做索引与搜索,但是它的目的是使全文检索变得简单, 通过隐藏 Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API. Elasticsearch 不仅仅只是一个全文搜索引擎. 它可以被下面这样准确的形容: 一个分布式的实时文档存储,每个字段可以被索引与搜索--作数据库用 一个分布式实

Elasticsearch系列---补充几个知识点

概要 bulk api有趣的json格式 前面<简单入门实战>一节中,有介绍bulk的使用示例,大家一定很奇怪,还有这么有趣的JSON格式,必须严格照他的换行来做,我想把JSON搞得美观可读性好一点,居然给我报错! {"action": {"meta"}}\n {"data"}\n {"action": {"meta"}}\n {"data"}\n 它为什么要这样规定? 我们

Elasticsearch系列---相关性评分算法及正排索引

概要 上一篇中多次提到了按相关性评分,本篇我们就来简单了解一下相关性评分的算法,以及正排索引排序的优势. 评分算法 Elasticsearch进行全文搜索时,Boolean Model是匹配的基础,先用boolean model将匹配的文档挑选出来,然后再运用评分函数计算相关度,参与的函数如我们提到的TF/IDF.Length Norm等,再加上一些控制权重的参数设置,得到最后的评分. Boolean Model 作为全文搜索的基础,Boolean Model的结果决定文档是否要进行下一步的评分

Elasticsearch系列---实战零停机重建索引

前言 我们使用Elasticsearch索引文档时,最理想的情况是文档JSON结构是确定的,数据源源不断地灌进来即可,但实际情况中,没人能够阻拦需求的变更,在项目的某个版本,可能会对原有的文档结构造成冲击,增加新的字段还好,如果要修改原有的字段,只能重建索引了. 概要 本篇以实战方式讲解如何零停机完成索引重建的三种方案. 外部数据导入方案 整体介绍 系统架构设计中,有关系型数据库用来存储数据,Elasticsearch在系统架构里起到查询加速的作用,如果遇到索引重建的操作,待系统模块发布新版本后