增加的操作一般使用
PUT或者POST twitter/_doc/1(或者不加id,使用默认id)
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}```
但是一个简单的增加操作中,还有其他不经常用到但是比较重要的知识,都有哪些呢?
返回结果
返回结果一般长这样:
{
"_shards" : {
"total" : 2,
"failed" : 0,
"successful" : 1
},
"_index" : "twitter",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"result" : "created"
}
其中shards需要注意,total标识es一共有几个分片,默认是两个,successful表示本次操作成功的分片有几个,一般一个节点维护一个分片,所以本次成功的分片只有一个。
自动创建索引
当创建记录时,如果索引不存在,则es会默认创建所需的索引。当然,是否自动创建索引以及自动创建什么样的索引,es也是可以设置的。
例如:
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "twitter,index10,-index1*,+ind*" (false 或 true(默认))
}
}
表示自动创建twitter和index10索引,不自动创建index1*
之类的索引,但是会创建ind*
之类的索引,也可以直接设置为false
禁用自动创建索引。
操作类型
在创建记录时,可以指定操作类型op_type=create
指定当记录已存在时,则返回错误。
自动生成id
当使用PUT方法创建记录时,则必须指定id。如果不想指定id,对id不关心,则可以使用POST方法,此时便可省略指定的id。
例如:
POST twitter/_doc/
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
每次操作需要等待执行完毕的分片数
在默认的创建记录的场景中,es只需等待主节点也就是primary分片创建成功后返回结果,无需等待其他分片操作完成,返回结果后,其他分片再从primary分片复制数据。
但,有时候为了数据安全起见,需要一定数量的分片数都执行完毕后才返回数据,这时候,设置index.write.wait_for_active_shards
就排上用场了。
wait_for_active_shards的值不能大于你的总的分片数,也就是你创建记录返回结果中的total
值。当然最好不要大于你的节点数,一般一个节点维护一份分片,为什么要这样呢?
举个例子,你是单节点部署的,只有一个节点,但是默认分片数是2,就像我们平常在本机上的那样,默认的wait_for_active_shards是1,如果我设置成3,那肯定要报错;如果设置成2,那也是有问题的,因为你只有一个节点,一个活动的分片,但是非要等到两个节点都ok才返回,那就很伤了,es会一直等直到超时或者有新的节点加进来才会返回结果。
refresh
增加记录时,参数refresh可以控制是否立即刷新,刷新可以使记录立即对查询可见,默认不设置,不设置就只能等待es每秒一次的自动刷新了。
超时
参数timeout=5m可以控制超时时间为5分钟,默认一分钟。
版本控制
在上面的返回结果中,有这样的一条信息:"_version" : 1
,每次更改记录都会使记录的版本号+1,版本号有啥用呢?版本号一方面记录了你的更改次数,一方面还可以通过版本号回复某一版本的记录。
默认情况下,版本号是es自己管理的,也可以通过创建记录时的参数version=2&version_type=external
手动控制版本号,version_type=external就表示版本号是来自外部,不是es自己的,注意这时候输入的版本号只能大于目前的记录的版本号。
version_type有多种取值,默认就是internal
,es自己的;还有上面的external
等价于external_gt
;还有一种是external_gte
,表示给定版本号大于等于当前版本号时才更新文档,需要注意的是,因为采用这种配置,本次记录更新了,但是版本号却不增长,有可能导致数据的异常或丢失。
无改动的更新
在默认情况下,使用
PUT(POST) twitter/_doc/1
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
会使版本号+1,尽管这次并没有改动。你很生气,没改动为什么还要+1,为了达到记录内容没更新版本号也不更新的目的,就需要使用专门的更新api.
5.x版本的更新操作:
127.0.0.1:9200/my_index/doc/1/_update
{
"doc": {
"name": "Jane Jane"
}
}
6.x版本的更新操作:
127.0.0.1:9200/my_index/_update/1
{
"doc": {
"name": "Jane Jane"
}
}
这时候实质内容不更新时,版本号就不会+1了。