前文我们提到,Elasticsearch的数据都存储在索引中,也就是说,索引相当于是MySQL中的数据库。是最基础的概念。今天分享的也是关于索引的一些常用的操作。
curl -X PUT "localhost:9200/jackey?pretty"
ES创建索引使用PUT请求即可,上面是最简单的新建一个索引的方法,除此之外,你还可以指定:
索引名称有以下限制:
\
,/
,*
, ?
, "
, <
, >
, |
,
(空格),,
, #
-
,_
和+
开头.
或..
请求支持的一些参数有:
前面我们提到创建索引时可以指定三种属性,这三种属性都需要放在body中。
索引的别名,一个别名可以赋给多个索引。
给一个index起别名的方式有两种,一种是创建index时候在body中增加aliases,另一种是通过更新已有索引的方式增加。
方式一:
curl -X PUT "localhost:9200/jackey?pretty" -H 'Content-Type: application/json' -d'
{
"aliases" : {
"alias_1" : {},
"alias_2" : {
"filter" : {
"term" : {"user" : "kimchy" }
},
"routing" : "kimchy"
}
}
}
'
方式二:
curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
"actions" : [
{ "add" : { "index" : "jackey", "alias" : "alias1" } }
]
}
'
方式一中,我们还在body中增加了filter和routing。这主要是用于指定使用别名的条件。指定了filter后,通过alias_2,只能访问user为kimchy的document。而routing的值被用来路由,即alias_2只能路由到指定的分片。此外还有index_routing和search_routing,它们和routing类似,这里不做过多解释了。还有一个比较重要的属性是is_write_index,这个属性默认是false,如果设置成true,表示可以通过这个别名来写索引,默认情况下,别名像一个软链接,是不可以修改原索引的。
此外,还可以使用通配符为多个索引增加相同的别名
curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
"actions" : [
{ "add" : { "index" : "test*", "alias" : "all_test_indices" } }
]
}
'
除了add,还可以使用remove来删除别名
curl -X POST "localhost:9200/_aliases?pretty" -H 'Content-Type: application/json' -d'
{
"actions" : [
{ "remove" : { "index" : "test1", "alias" : "alias1" } }
]
}
'
先看一个例子:
curl -X PUT "localhost:9200/twitter?pretty" -H 'Content-Type: application/json' -d'
{
"settings" : {
"index" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
}
'
索引的setting分为静态和动态两种。静态的只能在索引创建或关闭时设置;动态的则可以使用update-index-settings API来实时设置。上面的例子中,number_of_shards属于静态设置,number_of_replicas属于动态设置。
索引可以设置的setting可以在官方文档的Index modules查看,下面我会挑几个我认为比较重要的介绍一下。
先从静态开始:
动态setting:
除了以上静态setting和动态setting之外,setting中还可以设置一些其他的值,例如分词器等,这些我们以后再做更详细的介绍。
curl -X PUT "localhost:9200/test?pretty" -H 'Content-Type: application/json' -d'
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"properties" : {
"field1" : { "type" : "text" }
}
}
}
'
Mapping主要用于帮助Elasticsearch理解每个域中数据的类型。7.0.0之前mapping的定义通常包括type名称。Elasticsearch支持的数据类型比较多,其中比较核心的简单数据类型包括:
其他的类型,我们以后会做更加详细的介绍。
删除索引使用的是DELETE请求。
curl -X DELETE "localhost:9200/jackey?pretty"
你可以在路径中指定具体索引,也可以使用通配符,需要删除多个索引时,可以使用逗号分隔。如果要删除全部索引,可以指定索引为_all或*(不要这么做)。在生产环境,我们通过在elasticsearch.yml文件中将action.destructive_requires_name配置为true来禁止这些危险的操作。
删除操作支持的参数有以下几种:
前面我们已经提到过了打开/关闭索引。被关闭的索引几乎不能对它进行任何操作,它只是用来保留数据的。而打开或关闭索引通常需要重启分片来使操作生效。具体的操作如下:
curl -X POST "localhost:9200/jackey/_open?pretty"
curl -X POST "localhost:9200/jackey/_close?pretty"
支持的参数有:
这些参数在前面都有介绍。这里就不再赘述了。
随着数据的越来越多,我们可能会有拆分索引的需求,感谢ES为我们提供了便利。
curl -X POST "localhost:9200/twitter/_split/split-twitter-index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index.number_of_shards": 2
}
}
'
在拆分索引之前,要保证索引是只读状态,并且集群健康状态为green。设置只读的方法是:
curl -X PUT "localhost:9200/my_source_index/_settings?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index.blocks.write": true
}
}
'
拆分索引的具体操作是:
关于索引的使用就先介绍到这里。还有很多不完善的地方,以后会继续补充。想要了解更多详细信息的同学可以查看官方文档。