ElasticSearch学习之Es索引Api操作
作者:程序员皮卡秋
Es索引Api操作
在操作之前,先给大家简单的说下索引
,在es中,默认所有数据都会建立索引,我们可以类比它是数据库中的库
,这里需要提示的是所有的索引index
都必须要小写
。
创建索引
语法:
PUT /${idnexName}
运行:
PUT /test
输出:
{ "acknowledged" : true, "shards_acknowledged" : true, "index" : "test" }
这样我们就创建了test
索引,建完之后,我们可以到manager
也就是控制台左下角的设置图标,点击之后进入索引管理
,这样我们就看到了刚刚建的索引,也可以查看的它的一些信息
索引别名
有时候,我们的索引非常多,管理起来就会变的麻烦,es
为我们提供了aliases
,也就是别名
,我们可以简单的理解为对```index````做的标记,它可以是一对一,也可以是一对多,下面就给大家演示一下,如何添加
语法:
POST _aliases
这里给大家举个例子,比如年级,一到六年级的索引可能是class_1,class_2,class_3,class_4,class_5,class_6
,我们在起别名的时候,也不是乱起的,在规范中,建议使用有意义的字段使其归为子集,比如可以统一叫做class
添加索引别名
一对一:
POST _aliases { "actions":[ { "add":{ "index":"class_1", "alias":"class" } } ] }
一对多,这里指的是一个别名对应多个索引:
POST _aliases { "actions":[ { "add":{ "indices":[ "class_1", "class_2" ], "alias":"class" } } ] }
多对一,这里指的多个别名对应一个索引:
POST _aliases { "actions":[ { "add":{ "index":"class", "aliases":[ "class_1", "class_2" ] } } ] }
输出:
{ "acknowledged" : true }
查询索引别名
语法:
GET ${indexName}/_alias
查询class_1:
GET /class_1/_alias
输出:
{ "class_1" : { "aliases" : { "class" : { } } } }
删除索引别名
其实很简单,只需要把add
改为 remove
就好了,举个例子,删除class_1的索引别名:
- 一对一
POST _aliases { "actions":[ { "remove":{ "index":"class_1", "alias":"class" } } ] }
我们在查询一下:
{ "class_1" : { "aliases" : { } } }
可以看到已经被我们删掉了
一对多
POST _aliases { "actions":[ { "remove":{ "indices":[ "class_1", "class_2" ], "alias":"class" } } ] }
多对一
POST _aliases { "actions":[ { "remove":{ "index":"class", "aliases":[ "class_1", "class_2" ] } } ] }
这里就不带大家一一输出了,自己试着运行一下。接着我们继续看剩下的两个属性~
mapping
这个mapping
是什么意思呢?字面理解好像是映射,那么它映射什么?我们以mysql
为例,在创建表的时候,会对字段进行声明,比如字段名称,字段大小以及类型等等,在es中,同样会对文档的字段进行声明,包括字段类型,所否分词,是否索引,分词规则等多种属性,mapping
就是提供这个作用的,所以这个大家要先理解。
es中提供了动态mapping
以及静态mapping
两种方式来声明一个类型中文档的字段,mapping
的属性有很多,这个后边给大家整理好,本节先带大家体验一下如何操作
settings
setting
属性用于设置当前索引的分片数,副本数等信息,常用的主要有:
index.number_of_shards
:索引分片数
index.number_of_replicas
:索引副本数
index.refresh_interval
: refresh频率,默认1s。当数据对实时刷新要求不那么高时,可以适当调大改值。当值=-1时,代表不会进行refresh操作,但是请保证es的虚拟机内存足够大,不然会造成内存溢出
常见设置:
PUT class_1 { "settings":{ "index":{ "number_of_shards":3, "number_of_replicas":1, "refresh_interval":"3s" } } }
下面我们看下完整的索引创建:
PUT class_1 { "aliases":{ "class":{ } }, "mappings":{ "properties":{ "num":{ "type":"long" }, "name":{ "type":"text", "fields":{ "keyword":{ "type":"keyword", "ignore_above":256 } } } } }, "settings":{ "index":{ "refresh_interval":"3s", "number_of_shards":"3", "number_of_replicas":"1" } } }
有几个mapping的属性给大家说下:
fields
这个属性的意思是·多字段属性
,让一个字段拥有多个子字段类型,使得一个字段能够被多个不同的索引方式进行索引,keyword
不会做分词处理。类型为keyword
的字段只能通过精确值搜索到。类型适用于索引结构化的字段,在Elasticsearch 5.X 之后的字段类型不再支持 string,由 text 或 keyword 取代。如果仍使用 string,会给出警告。ignore_above
: keyword,text类型字段都可以设置ignore_above属性(默认是10) ,表示最大的字段值长度,*超出这个长度的字段将不会被索引,但是会存储,ignore_above一般设置为256,设置为30000可能会出现BulkFailureException
查询索引
上边我们讲的是创建,下面我们看下怎么查询
查询当前集群全部索引
语法:
GET _cat/indices?v
输出:
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size green open .kibana_task_manager_1 RN3mjh1qRbi7wnHnZAvD1g 1 1 2 0 77.8kb 41.8kb green open .apm-agent-configuration FFRPssv0SLGYNSh5_OGPeA 1 1 0 0 566b 283b green open kibana_sample_data_logs E2e-LpmvSwm62txGvhl3Ow 1 1 14074 0 21.7mb 10.7mb green open class_1 UGsT0F5nQa-p68I7NbBWqg 3 1 0 0 1.1kb 690b green open .kibana_1 2bvqPg7nSiSqKahUdJuevw 1 1 51 4 284.4kb 143.1kb
查询单个索引
GET class_1
会输出一段json描述信息:
{ "class_1" : { "aliases" : { "class" : { } }, "mappings" : { "properties" : { "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "num" : { "type" : "long" } } }, "settings" : { "index" : { "refresh_interval" : "3s", "number_of_shards" : "3", "provided_name" : "class_1", "creation_date" : "1670811044703", "number_of_replicas" : "1", "uuid" : "UGsT0F5nQa-p68I7NbBWqg", "version" : { "created" : "7060299" } } } } }
有时候索引字段非常多的时候,如果我们想查询索引的单个字段,怎么做呢?
- 只查询
mapping
GET /class_1/_mapping
输出:
{ "class_1" : { "mappings" : { "properties" : { "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "num" : { "type" : "long" } } } } }
- 只查询
settings
:
GET /class_1/_settings
输出:
{ "class_1" : { "settings" : { "index" : { "refresh_interval" : "3s", "number_of_shards" : "3", "provided_name" : "class_1", "creation_date" : "1670811044703", "number_of_replicas" : "1", "uuid" : "UGsT0F5nQa-p68I7NbBWqg", "version" : { "created" : "7060299" } } } } }
修改索引
不同于mysql
,你可以通过一个update
把表的字段改掉,当然当你数据量很小的时候。在es中,es基于lucene,而lucene中的每个segment都具有不变性。因此每个Index一旦创建完成就不可修改。那怎么做呢?修改的另一种方式叫做数据迁移
,也就是通过建立新索引,旧数据迁移到新索引的形式更新索引,在mysql
中,有时在无法改变原表结构的时候,我们也是通过这种方式进行的。下面通过一个例子给大家体会下:
语法:
POST _reindex { "source":{ "index":"oldIndex" }, "dest":{ "index":"newIndex" } }
首先创建class_2
PUT class_2
将class_1转移到class_2上:
POST _reindex { "source":{ "index":"class_1" }, "dest":{ "index":"class_2" } }
查询之后发现class_2
并没有发生什么结构变化,在这之前我们创建点数据,然后在迁移,这样看的比较明显一点,向class_1插入数据, 文档操作后边会给大家讲,先简单操作一下:
GET /class_1/_doc/ { "name":"一年级", "num": 20 }
然后再执行_reindex
, 查询class_2
输出:
{ "class_2" : { "aliases" : { "class" : { } }, "mappings" : { "properties" : { "name" : { "type" : "text", "fields" : { "keyword" : { "type" : "keyword", "ignore_above" : 256 } } }, "num" : { "type" : "long" } } }, "settings" : { "index" : { "creation_date" : "1670811901557", "number_of_shards" : "1", "number_of_replicas" : "1", "uuid" : "PvK25pp6Tu6A0CiMpArRZQ", "version" : { "created" : "7060299" }, "provided_name" : "class_2" } } } }
我们发现,class_1
的属性都被转移到了class_2
上
删除索引
语法:
DELETE ${indexName}
我们删除旧索引class_1
DELETE class_1
在查询,发现已经找不到class_1
了
想删除多个怎么办呢? 方法如下:
DELETE ${indexName}, ${indexName}
结束语
本节主要讲了索引
相关的api操作,索引作为数据基石,显得尤为重要,所以大家在学习的时候,特别是创建索引,一定要多去理解和练习,好比我们在数据库中建表一样,第一步都很重要,因为这个直接影响到你后边生产的数据,所以,在下节,我会给大家好好理一下mapping
。