〈二〉ElasticSearch的认识:索引、类型、文档
发表日期:2019年9月19日
上节回顾
在学习新的内容之前,先回顾一下上节的内容,上节主要讲述了以下的内容:
- ElasticSearch是什么?什么是搜索引擎?为什么选择ElasticSearch?
- 搜索是怎么做到的:分词、倒排索引?
- 环境的搭建
- 如何通过kibana操作elasticsearch
- hello world中讲述了如何使用“写数据->查指定数据”,"写数据->通过关键字搜索数据"
本节前言
这节将涉及index、type、document的增删查改相关的内容。
index就像sql中的库,type就像sql中的表,document就像sql中的记录。
这节认识index,type,document,会帮助我们认识ElasticSearch数据存储的逻辑结构。就好像你学SQL要先学会了建库、建表,才能插入记录。而一些更深一点的内容,例如如何对document进行搜索、排序,这些将留到下一节再讲。
索引index
索引index是存储document文档数据的结构,意义类似于关系型数据库中的数据库。
创建索引
在上一节的hello world中,我们并没有讲如何创建索引,那里直接就插入了数据,那样的话ElasticSearch会帮我们以默认的配置来自动创建索引。
下面讲一下如何手动创建索引:
语法:
// 语法:
PUT /索引名
{
index的配置(primary shard的数量等)
}
例子:
// 例子(不带配置信息的话以默认配置创建)【请不要复制这个注释!】:
PUT /product
// 例子(带配置信息的话以配置信息创建)【请不要复制这个注释!】
PUT /product
{
"settings":{
"index":{
"number_of_shards":3,
"number_of_replicas":1
}
}
}
在上述的例子中:number_of_shards是主分片的数量;number_of_replicas是副本分片的数量(这里提一下,number_of_replicas副本分片的数量是面向主分片的,所以这个值为1时代表每一个主分片有一个副本分片)。
返回结果:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "product"
}
【在插入一个文档的时候,如果index还没有创建,那么会自动创建,这时候index的一些配置会采用默认的配置,默认的主分片数量是5,副本分片数量是1】
查看索引
查看单个索引
语法:GET /索引名
效果:返回指定索引的信息
例子:GET /product
返回结果解析:

- aliases:是索引的别名,由于我们没有定义索引别名所以没有数据(索引别名后面再讲)
- mappings:是索引中存储的数据的结构信息,由于上图的索引product中并没有存储document,而且我们也没有指定,所以也为空。mappings定义了文档的字段的数据类型和搜索策略等信息。【后面的知识点】
- settings:索引的配置信息
- creation_date是创建日期(毫秒级别的时间戳)
- number_of_shards是主分片数量
- number_of_replicas是副本分片的数量
- uuid是索引的id
- version是索引的版本信息
- provided_name是索引名
一个包含了mappings的结果图:

查看所有索引
命令:GET /_cat/indices?v
效果:查看所有索引,显示索引的健康状态等信息。
【如果没有v选项,那么就不会有第一行关于该列意义的头部】
返回结果解析:

- health: 索引的健康状态(受分片的运行状态影响)【集群管理的知识点】
- status: 索引是开启的还是关闭的
- index: index的名称
- uuid:索引的UUID
- pri: primary shared的数量
- rep: replicated shared的数量
- docs.count: 文档document的数量
- docs.deleted: 被删除的文档document的数量
- store.size:总数据的大小
- pri.store.size:主分片上的数据的大小(这里因为只运行了一个服务节点,所以没有可运行的副本分片,所以总数据大小等于主分片的数据大小)
删除索引
语法:DELETE /索引名【支持同时删除多个索引,以逗号分割,如DELETE /testindex1,testindex2】
语法例子:DELETE /product
返回结果:【当acknowledged为true的时候代表删除成功】
{
"acknowledged": true
}
修改索引
【修改索引主要是修改分片数量、mapping、分词器,由于mapping和分词器涉及很深,需要前置知识,所以留到后面讲。】
修改副本分片数量
不讲语法了,直接看例子:
PUT /product/_settings
{
"index":{
"number_of_replicas":2
}
}
关闭索引
关闭索引是为了避免修改索引的配置时他人进行文档读写。关闭索引后,就只能获取索引的配置信息,而不能读写索引中的document。有时候也用于关闭一些无用的索引来减少资源消耗。
语法:
- 关闭索引:
POST /索引名/_close - 打开索引:
POST /索引名/_open
索引别名
索引别名是一个“别名”,但能够像索引名那样使用,它的使用场景一方面是“使用更简洁的索引名来获取数据”,另一个方面是“通过索引别名来指向索引(别名B指向索引A),方便修改指向的索引,用于解决可能的更换索引的场景(比如你需要统一修改原有索引的信息,那你可以新建索引C,C存储了修改后的数据,更改指向原本索引A的索引别名B指向C)。”
增加索引别名:
语法:
POST /_aliases
{
"actions":[
{
"add":{
"index":"索引名",
"alias":"索引别名"
}
}
]
}
例子:
POST /_aliases
{
"actions":[
{
"add":{
"index":"product",
"alias":"pdt"
}
}
]
}
查看索引别名:
- 方法一:通过查看索引来查看索引别名:
GET /product - 方式二:通过命令
GET /product/_alias - 【索引别名有了就会生效,不信你在
GET /product的时候直接用上别名】
删除索引别名:
语法:
POST /_aliases
{
"actions":[
{
"remove":{
"index":"索引名",
"alias":"索引别名"
}
}
]
}
例子:
POST /_aliases
{
"actions":[
{
"remove":{
"index":"product",
"alias":"pdt"
}
}
]
}
【你应该看到了,actions里面是一个数组,所以你是可以同时进行多个操作的。】
补充
- 有很多关于index的配置。由于也是一个比较大的知识点(需要一些前置知识,单独在这里讲的话会很空白),将会单独列出来。
- index有个mapping配置,mapping定义整体的index的document的结构,和影响分词策略。由于会影响搜索,所以把这个归为搜索的分支知识点,将留到搜索篇再谈。
小节总结:
本小节讲了如何创建索引,如何查看索引、如何删除索引、如何修改索引(修改副本分片数量)、如何关闭/开启索引、如何定义索引别名。
目的在于介绍如何创建存储document的逻辑结构--索引,虽然我们有时候是不需要手动显示创建索引的,但手动创建是个必须了解的知识,因为mapping和分词器有时候需要手动来指定。
类型type
类型type也是用于存储document的逻辑结构,相对于index来说,type是index的下级,所以通常在面向有实际意义的数据时,index作为大类的划分,type作为小类的划分。比如如果把book书作为一个大类来建立index的话,那么书的类型(小说类、文学类、IT技术类等)就可以作为type。
你可能以为下面要讲如何CRUD类型type了吧。但其实这里并不需要讲这些,因为type其实并不真的用来划分逻辑结构,它只是意义上的!ElasticSearch使用了Lucene的底层架构,而Lucene是没有type。
上面说了,index就像sql中的库,type就像sql中的表,document就像sql中的记录。
但事实上,ElasticSearch“真正用于分隔数据的结构“只有index,而没有type,type实际上作为了一个元数据(类似SQL中的id,作为额外的标识数据)来实现逻辑划分。【如果你不懂的话,可以从SQL方面想,就好像一个职员表,一条记录中的某一个字段说明了他属于哪个部门】。当然了,这是一些偏原理的内容了。这些都将留到原理篇来阐述。这里仅仅是浅尝即止。
不过由于没有type没有真实地用于分隔数据,所以要注意结构类型偏差太大的数据还是不要放在一个index好。
之前说了,index用来划分大类,type用来划分小类。而可能有些人会把这个大类定的过大,比如电影和书籍这两个小类(type)的数据大多是不一样的,但他们都可以属于娱乐这一个大类(index),由于type并没有真实地用于分隔数据地用于存储数据,所以数据存储的时候针对的还是index。
ElaticSearch并不是完全无结构的,不要与某些NoSQL数据库混为一谈,虽然它的结构非常灵活(面向json,可以随意增加字段)。在index中还有一个mapping,mapping管理了整个index的各个字段的属性,也就是定义了整个index中document的结构。我们在index下不同type中定义的document的字段都会在mapping中。所以说,如果你定义的多个type的结构偏差太大,那么会导致mapping需要存储的字段的数据过多,同时也影响index的物理存储结构,因为index会按照mapping来存储数据。【换到SQL中的话,也就是比如你有一个商品表,商品表下面有各种商品(书籍、食物),而它们的数据是很不一样的,比如书籍有出版日期,食物有保质期,如果把它们都放到一个表中的话,那么就会导致这个表的字段过多。】
如何测试document文档的数据结构是面向index?【这个测试你可以不做,现在仅仅记住上面的知识点,测试后面再做,因为这个涉及到一些后面的知识】
1.定义一个document的一个字段为date类型;然后在另一个type中添加为text类型的同名字段。
当我们直接插入document的时候,如果不指定document的数据结构,那么ElastciSearch会基于dynamic mapping来自动帮我们声明每一个字段的数据类型,比如"content":"hello world!"会被声明成字符串类型,"post_date":"2017-07-07"会被认为是date类型。如果我们首先在一个type中声明了content为字符串类型,再在另外一个type中声明成日期类型,这会报错,因为对于index来说,这个content已经被声明成字符串类型了。2.查看mapping:
在查看mapping的时候,我们是通过查看索引来查看的,其实也反向证明了mapping是面向index的。
补充:
- 上面说了index的mapping会存储完整的多个type的字段信息,如果type的字段差别太大,那么就会导致mapping需要存储的字段过多。ElasticSearch维护组织后面发现这多个type的情况确实有点烦人。于是他们准备让一个index只放一个type了,在6.x版本中,一个索引下只有一个type,如果声明多个type,会被标记为过期,但是仍可以使用。7.0之后的版本将完全移除 。ElasticSearch移除多个type
小节总结:
- 本节重新解释了type的意义,type实际上是作为document中的一个固定字段存在的,文档的数据结构是面向index的,所以不能把字段差异性较大的数据存储在一个index中。
文档document
文档的格式是json式的。
对于文档,有几个主要的标识信息:_index(插入到哪个索引中),_type(插入到哪个类型中),_id(文档的id是多少),在插入一个文档的时候,这几个信息也是必须的。
- 在考虑web开发的大多都知道json的基本格式,所以我这里只会编写一个简单的json数据作为例子,json数据里面的数据类型问题留到后面再进行补充。
插入文档
语法:
PUT /index/type/id
json格式的数据
例子:
PUT /douban/book/4
{
"book_id":4,
"book_name":"Other Voices, Other Rooms",
"book_author":"Truman Capote",
"book_pages":240,
"book_express":"Vintage",
"publish_date":"1994-02-01",
"book_summary":"""
Truman Capote’s first novel is a story of almost supernatural intensity and inventiveness, an audacious foray into the mind of a sensitive boy as he seeks out the grown-up enigmas of love and death in the ghostly landscape of the deep South.
At the age of twelve, Joel Knox is summoned to meet the father who abandoned him at birth. But when Joel arrives at the decaying mansion in Skully’s Landing, his father is nowhere in sight. What he finds instead is a sullen stepmother who delights in killing birds; an uncle with the face—and heart—of a debauched child; and a fearsome little girl named Idabel who may offer him the closest thing he has ever known to love."""
}
结果解析:

_index:插入到哪个index中。_type:插入到哪个type中。_id:插入的文档的id是多少。_version:版本,对这个ID的文档的操作次数- result:操作结果,第一次操作时created,上图中因为我忘记截图了,所以重新插入了一次,所以时updated
- _shards:
- total:总共有多少个shard
- successful:成功多少个,【由于写操作只会发生在primary shard中,所以这里为1,另一个shard时replica shard,不发生写操作】
- failed:失败多少个
查询指定文档
语法:
GET /index/type/id
例子:
GET /douban/book/1
结果解析:

更新文档
语法:
// 全替换(覆盖)式更新:会使用新的json数据直接覆盖原有的【请不要复制注释】
PUT /index/type/id
json数据
// 部分替换式更新:只会覆盖指定数据
POST /index/type/id/_update
{
"doc": {
"需要修改的字段": "修改值"
[,"需要修改的字段": "修改值"]
}
}
例子:
【全替换语句与插入差不多,所以不举例了】
POST /douban/book/4/_update
{
"doc": {
"book_pages":241,
"publish_date":"1994-02-02"
}
}
结果解析:
返回结果与插入时大概一致,不同的时result变成了updated
删除文档
语法:
DELETE /index/type/id
例子:
【删除后可以重新执行插入语句恢复数据】
DELETE /douban/book/4
结果解析:
返回结果与插入时大概一致,不同的时result变成了deleted.
查询所有文档
语法:
GET /index/type/_search
GET /index/type/_search
{
"query":{
"match_all": {}
}
}
例子:
GET /douban/book/_search
GET /douban/book/_search
{
"query":{
"match_all": {}
}
}
补充:
上面介绍了关于文档的CRUD基操,但还有很多东西没讲,这些将留到后面讲,包括:文档的字段的数据类型、文档的搜索、文档的元数据(_index,_type,_id等)
小节总结
这节讲了如何对文档进行CRUD操作,PUT用于插入,GET用于查询,PUT和POST用于修改,DELETE用于删除。
〈二〉ElasticSearch的认识:索引、类型、文档的更多相关文章
- elasticsearch查询篇索引映射文档数据准备
elasticsearch查询篇索引映射文档数据准备 我们后面要讲elasticsearch查询,先来准备下索引,映射以及文档: 我们先用Head插件建立索引film,然后建立映射 POST http ...
- 〈一〉ElasticSearch的介绍
目录 什么是ElasticSearch 核心能力 ES的搜索核心 搜索引擎选择 搜索的处理 补充: 小节总结: 基本学习环境搭建 如何操作ElasticSearch 下载.安装和运行(Based Wi ...
- ElasticSearch查询 第二篇:文档更新
<ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...
- Elastic Stack 笔记(四)Elasticsearch5.6 索引及文档管理
博客地址:http://www.moonxy.com 一.前言 在 Elasticsearch 中,对文档进行索引等操作时,既可以通过 RESTful 接口进行操作,也可以通过 Java 也可以通过 ...
- Elasticsearch配置详解、文档元数据
目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch配置文件详解 a. 在上面博客中,我们已经安装并且成功 ...
- ElasticSearch 学习记录之 分布式文档存储往ES中存数据和取数据的原理
分布式文档存储 ES分布式特性 屏蔽了分布式系统的复杂性 集群内的原理 垂直扩容和水平扩容 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中 ES集群特点 ...
- ElasticSearch权威指南学习(文档)
什么是文档 在Elasticsearch中,文档(document)这个术语有着特殊含义.它特指最顶层结构或者根对象(root object)序列化成的JSON数据(以唯一ID标识并存储于Elasti ...
- ElasticSearch 5学习(8)——分布式文档存储(wait_for_active_shards新参数分析)
学完ES分布式集群的工作原理以及一些基本的将数据放入索引然后检索它们的所有方法,我们可以继续学习在分布式系统中,每个分片的文档是被如何索引和查询的. 路由 首先,我们需要明白,文档和分片之间是如何匹配 ...
- VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)
VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)-软件开发-鸡啄米 http://www.jizhuomi.com/software/141.html 上一讲中讲了VS20 ...
随机推荐
- JavaWeb购物车
一.类关系 最近又把JavaWeb方面的知识(Servlet.jsp等)过了一遍,发现以前还是接触的太窄太浅.加上才转到IntelliJ IDEA 上故而想用这个项目练练,就当熟悉熟悉IntelliJ ...
- tensorflow学习笔记——图像数据处理
喜欢摄影的盆友都知道图像的亮度,对比度等属性对图像的影响是非常大的,相同物体在不同亮度,对比度下差别非常大.然而在很多图像识别问题中,这些因素都不应该影响最后的结果.所以本文将学习如何对图像数据进行预 ...
- error LNK2001: unresolved external symbol "__declspec(dllimport)
作为C++的小白,出现这个错误,是最头痛的.针对这种问题,我搜了网上的相关答案,很多都是在教Project ---> Settings中改动相关设置.我改了之后,问题依旧没有解决.后面查了这种问 ...
- java JVM原理讲解和调优和gc
- python 30 基于TCP协议的socket通信
目录 1. 单对单循环通信 2. 循环连接通信:可连接多个客户端 3. 执行远程命令 4. 粘包现象 4.1 socket缓冲区 4.2 出现粘包的情况: 4.3 解决粘包现象 bytes 1. 单对 ...
- unityshader(属性)
_Color("Color",Color)=(1,1,1,1)//RGBA _Vector("vector",Vector)=(1,2,3,4) //,fixe ...
- Codeforces 1204C
题意略. 思路:我的想法是逐步地找出这个序列中的重要点,我要判断当前这个点能不能删去,就要看上一个重要点和当前这个点 i 在序列中的下一个点 i + 1之间的距离 是否是最短距离,如果是,那么我们就可 ...
- 解决org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.xyfer.dao.UserDao.findById
在使用Spring整合MyBatis的时候遇到控制台报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (no ...
- 「每日五分钟,玩转JVM」:对象从哪来
面向对象 众所周知,Java是一门面向对象的高级编程语言,那么现在问题来了,对象从哪来呢?有些人会说通过new关键字来创建一个对象,说的很好,本篇我们就来解密在new一个对象的过程中,JVM都给我们做 ...
- python 用加法实现a,b两数相乘
"""思路:1.a * b = a + a + a + ... 2.a * b = n个a相加,只需求证b = n即可 3.用for 循环遍历即可,b就是range的最大 ...