ES 文档与索引介绍
在之前的文章中,介绍了 ES 整体的架构和内容,这篇主要针对 ES 最小的存储单位 - 文档以及由文档组成的索引进行详细介绍。
会涉及到如下的内容:
- 文档的 CURD 操作。
- Dynamic Mapping 和显示 Mapping 的区别
- 常见 Mapping 类型与常见参数介绍
- Index Template 和 Dynamic Template
对文档进行操作
单个文档 CRUD
和常见的数据库类似,ES 也支持 CURD 操作:
下面展示了对单个 ES 文档的操作:
| 操作名称 | URL | 解释 |
|---|---|---|
| Index | ![]() |
创建或者更新索引中的文档。在指定 id 的情况下,如果 id 存在,则会更新。如果不指定,则会创建。 |
| Get | ![]() |
查询某个文档。 |
| Delete | DELETE //_doc/<_id> | 删除某个指定的文档。 |
| Update | POST //_update/<_id> | 更新某个文档中的内容,可以理解成 Patch 的更新。如果想完全替换文档,请使用 index. |
下面是实际操作文档的例子, 打开 kibana 的开发者工具:
先来创建一个文档:
ES 在创建文档时,会有两种方式 index 和 create。index 与 create 不同在于,在指定 id 的情况下,如果 id 存在,index 会覆盖,同时版本号+1,而 create 会报错不让创建。
这里手动指定 id 为10,使用 index 方法,创建了一个文档,注意版本号为 1。

注意再次发送同样的情况,可以看到正常执行,版本号变成 2了。

但是使用 create 方法:

这里报错,显示文档已经存在。
需要注意的 ES 这里的更新并不是正常理解的更新,而是先把老文档删掉,然后创建一个新文档出来。
接着对文档进行更新:

可以看到这里只更新 user 字段,这种更新和之前 index 那种更新不同,属于部分更新,将增加的内容 merge 进原始文档。
对文档进行读取,这里由于之前更新了三次,所以 version = 3:

删除文档就很好理解了,但有一点需要注意,删除文档时并不会立马释放空间,而是将文档标记位 deleted 状态,后台进程会在合适的时候清理这些标记位已经删除的文档。
批量文档操作
批量写入
相较于当个文档的操作,大批量的操作对于 ES 来说,是更为常见的场景。ES 也提供了批量 API,该 API 支持在一次 API请求中包含 4 种类型, 并且 Response 中会针对每一条操作返回一个对应的结果。
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
批量读取
可以同时传入多个文档 id,进行读取,多个文档可以属于不同的索引。
GET /_mget
{
"docs": [
{
"_index": "my-index-000001",
"_id": "1"
},
{
"_index": "my-index-000001",
"_id": "2"
}
]
}
索引 - Mapping
索引是多个文档的集合,体现了逻辑空间的概念。对于每个索引来说都可以设置 Mapping 和 Setting 两部分。
其中 Mapping 定义了文档包含字段的类型与名称,以及如倒排索引,分词的一些设置。Setting 定义了如何将数据分布保存在不同的节点上。
数据类型
ES 中的数据类型分为三种:
- 简单类型
- 复杂类型
- 对象类型
- 嵌套类型
- 特殊类型
- 地理位置等
下图中显示了 ES 中常见的简单数据类型以及和 SQL 对应的关系。
| Elasticsearch type | Elasticsearch SQL type | SQL type | SQL precision |
|---|---|---|---|
| Core types | |||
null |
null |
NULL | 0 |
boolean |
boolean |
BOOLEAN | 1 |
byte |
byte |
TINYINT | 3 |
short |
short |
SMALLINT | 5 |
integer |
integer |
INTEGER | 10 |
long |
long |
BIGINT | 19 |
double |
double |
DOUBLE | 15 |
float |
float |
REAL | 7 |
half_float |
half_float |
FLOAT | 3 |
scaled_float |
scaled_float |
DOUBLE | 15 |
| keyword type family | keyword |
VARCHAR | 32,766 |
text |
text |
VARCHAR | 2,147,483,647 |
binary |
binary |
VARBINARY | 2,147,483,647 |
date |
datetime |
TIMESTAMP | 29 |
ip |
ip |
VARCHAR | 39 |
Dynamic Mapping
我们知道,Mapping 类似于数据库 Scheme 的定义,但回想之前对文档 CURD 的操作时,我们并未手动设置 Mapping,但可以自动创建文档,原因就在于利用了 Dynamic Mapping 的特性。就是即使索引不存在时,也可以手动创建索引,并根据文档信息自动推算出对应的 Mapping 关系。
比如之前创建的文档,如下就是生成的 Mapping 关系,ES 自动将 company 和 user 推断为 text 字段。

当 Dynamic Mapping 也有自己的缺点:就是推算不准确,比如上面的例子,company 和 user 的字段为 keyword 类型更为合适,以至于搜索时出现一些问题。
dynamic Mapping 可以通过 dynamic 字段进行控制, 其值为 true,false,strict 三种类型。
对于已经创建的索引,在修改 Mapping 分为两种情况:
- 增加新的字段:
- dynamic 为 true,新字段写入后,Mapping 也会被更新
- dynamic 为 false,字段可以写入到 _source, 但 Mapping 不会被更新,自然也不会被索引
- dynamic 为 strict,不允许写入
- 修改已经存在字段的类型:
- 不允许修改,因为 Lucene 生成的倒排索引,不允许被修改。
- 除非重新生成索引。
显示指定 Mapping
与 Dynamic Mapping 不同,显示指定 Mapping 可以允许我们手动指定 Mapping 结构。
编写 Mapping 有两种方式:
- 可以参考 doc
- 利用 dynamic 自动创建功能,查询后,自己再编辑成想要的结构。
看一个简单的例子:
PUT user
{
"user" : {
"mappings" : {
"properties" : {
"company" : {
"type" : "keyword"
"null_value": "NULL"
}
},
"name" : {
"type" : "keyword",
"index_options": "offsets"
},
"id_card" : {
"type" : "keyword",
"index": false # 表示该字段不需要被索引,不用被搜索到
}
}
}
}
"null_value":表示对 NULL 值可以进行搜索。
"index": false 表示该字段不需要被索引,不用被搜索到
"index_options": "offsets" 表示对倒排索引的结构进行设置:
- docs :表示记录 doc id
- freqs :表示记录 doc id 和 term frequencies
- position :表示记录 doc id 和 term frequencies 和 term position(Text 类型默认记录为 position)
- offsets: 表示记录 doc id 和 term frequencies 和 term position 以及 character offset.
关于倒排可以查看之前写的这篇文章。
Index Template 和 Dynamic Template
Index Template
考虑到数据不断增长的情况的,就需要按照一定的规则,将数据分散在不同的 Index 中。但每次都需要为每个 Index 设置 Mapping 和 Setting 关系。
这时 Index Template 就可以很好满足这个需求。
在 Index Template 中,可以通过设置一个通配名称,当创建的索引的名称,满足该条件时,就会使用模板的规则。
Note:
- 模板只会在创建新索引时生效,修改模板不会影响已经创建的索引。
- 可以设置多个模板,通过 "order" 参数,控制那个模板的规则生效。
下面这个例子就是为告警建立的一个 template,当创建的名字以 alarm 开头时,就会使用该索引。

Dynamic Template
在上面 Dynamic Mapping 的介绍中知道,ES 对于没有设置 Mapping 字段的内容,会自己推算一个类型,但这就可能造成推算类型不准确的情况。
这时就可以用 Dynamic Template 来解决,通过规范插入的字段的名称,来指定他的类型:
- 比如可以 is 开头的字段,都设置成 boolean
- long_ 开头的字段,设置成 long
- 所有字符串类型,设置成 keyword
Dynamic Template 直接作用在索引上, 看下面这个例子。
PUT my-index-000001
{
"mappings": {
"dynamic_templates": [
{
"longs_as_strings": {
"match_mapping_type": "string",
"match": "long_*",
"unmatch": "*_text",
"mapping": {
"type": "long"
}
}
}
]
}
}
PUT my-index-000001/_doc/1
{
"long_num": "5",
"long_text": "foo"
}
当匹配到以 long 开头的字符串时并且不包含以 _text 结尾,会将其设置成 long 类。
总结
本篇文章中,主要是对 ES 文档和索引的设置进行了说明。
ES 文档支持 CURD 操作,但需要知道 Index 和 create 的区别在于,对于指定 id 情况下的处理方式不同。同时为了适应大数据量的读取和写入,可以用 bulk api.
对于 ES 索引来说,在创建时,支持两种方式来指定 Setting 和 Mapping 的关系。一种 Dynamic Mapping,这种方式不需要手动设置 Index 格式,会根据文档自动的创建,但缺点在于推断的类型不不准确。而显示 Mapping,可以手动规定 index 的格式。
考虑到数据不断增长的情况,需要将数据拆分到不同的 index 上,可以通过 IndexTemplate 实现。
对于 Dynamic Mapping,推断不准确的情况,可以通过 Dynamic Template 手动规定创建的类型。
参考
https://www.elastic.co/guide/en/elasticsearch/reference/7.16/docs.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/mapping-params.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html
ES 文档与索引介绍的更多相关文章
- elasticsearch——海量文档高性能索引系统
elasticsearch elasticsearch是一个高性能高扩展性的索引系统,底层基于apache lucene. 可结合kibana工具进行可视化. 概念: index 索引: 类似SQL中 ...
- Elasticsearch 7.x 之文档、索引和 REST API 【基础入门篇】
前几天写过一篇<Elasticsearch 7.x 最详细安装及配置>,今天继续最新版基础入门内容.这一篇简单总结了 Elasticsearch 7.x 之文档.索引和 REST API. ...
- ElasticSearch入门系列(三)文档,索引,搜索和聚合
一.文档 在实际使用中的对象往往拥有复杂的数据结构 Elasticsearch是面向文档的,这意味着他可以存储整个对象或文档,然而他不仅仅是存储,还会索引每个文档的内容使之可以被搜索,在Elastic ...
- 用Lucene对文档进行索引搜索
问题 现在给出很多份文档,现在对某个搜索词感兴趣,想找到相关的文档. 简单搜索 一种简单粗暴的做法是: 1.读取每个文档:2.找到其中含有搜索词的文档:3.对找到的文档中搜索词出现的次数统计:4.根据 ...
- 第3章 ES文档和故障处理
第3章 ES文档和故障处理 一.ES网络配置表 ES网络配置表是ES的硬件和软件组成的列表.ES网络配置常包括以下项目: 分级 项目 杂项信息 系统名.系统厂商/型号.CPU速率.RAM.存储器.系统 ...
- Sandcastle帮助文档生成器使用介绍
一.软件介绍 Sandcastle是一个管理类库的文档编译器,是用于编译发布组件(Assembly)信息的一个工具,这个工具通过反射和Xslt技术,可以从dll文件及其xml注释(命令行编 ...
- glib 文档 代码 索引 编译
./configure --prefix=/opt/glib-2.28.8 --enable-staticmakemake install linux下载 WIN32下载 代码索引 文档索引 GLib ...
- IE11新文档模式Edge介绍与评估,及在WebBrowser应用中的使用。
浏览器模式与文档模式概念是怎么来的? 1.浏览器模式与文档模式概念起源 为了解决兼容性的问题,在IE浏览器(IE8, IE9, IE10)中,引入了浏览器模式和文档模式两个概念,浏览网页时可以通过按F ...
- kibana简单使用——elaticsearch的文档,索引的CRUD操作
1.初始化索引: #number_of_shards:分片的数量,mo'ren默认为5 #number_of_replicas:副本副本的副本的数量 #shards一旦设置不能修改 PUT lagou ...
随机推荐
- 6月26日 Django 中间件
前戏 我们在前面的课程中已经学会了给视图函数加装饰器来判断是用户是否登录,把没有登录的用户请求跳转到登录页面.我们通过给几个特定视图函数加装饰器实现了这个需求.但是以后添加的视图函数可能也需要加上装 ...
- 6月4日 python学习总结 装饰器复习
1. 装饰器的原理以及为什么要使用装饰器 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 在不影响原代码结构的情况下为其添加功能 2. 装饰器的基本 ...
- Redis的Unable to connect to Redis和java.io.IOException: 远程主机强迫关闭了一个现有的连接问题的解决
学习项目xhr系统用到springboot + vue(https://github.com/lenve/vhr),文档中要求使用到RabbitMQ,但是从我搭建开发环境来看,是否配置Rabbit ...
- 不会真有人还不会调用Excel吧?
哈喽,大家好!我是指北君. 大家有没有过这样的经历:开发某个项目,需要调用Excel控件去生成Excel文件.填充数据.改变格式等等,常常在测试环境中一切正常,但在生产环境却无法正常调用Excel,不 ...
- [NPUCTF2020]Baby Obfuscation wp
整体观察main函数,可以发现用户自定义函数和变量存在混淆,猜测为函数名及变量名asc混淆. 对函数进行分析: Fox1为欧几里得算法求最大公约数 Fox5其实是pow Fox4根据逻辑数学的法则实际 ...
- idea 下 Vue
一.需要了解的基本知识 node.js Node.js是一个Javascript运行环境(runtime),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装.N ...
- vue渐进式?
小到可以只使用核心功能,比如单文件组件作为一部分嵌入:大到使用整个工程,vue init webpack my-project来构建项目:VUE的核心库及其生态系统也可以满足你的各式需求(core+v ...
- Constant Pool和String Constant Pool详解
Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太明白Constant Pool到底是个怎 ...
- Java 中怎么获取一份线程 dump 文件?
在 Linux 下,你可以通过命令 kill -3 PID (Java 进程的进程 ID)来获取 Java 应用的 dump 文件.在 Windows 下,你可以按下 Ctrl + Break 来获取 ...
- spring-boot-learning-RabbitMQ
为什么需要MQ??? 异步处理: 场景: 用户注册后,需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式` 用户注册-发送注册邮箱-发送注册短信都完成之后才结束返回给客户端 邮 ...

