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
。