POST&PUT 创建索引区别
自动索引创建设置
指定创建行为
指定文档路由(Routing)
POST&PUT 创建索引区别
在HTTP中,PUT语意是代表具有幂等性操作(多次执行都能得到同样的结果)。
而POST则是非幂等,在资源创建时候,执行多次会产生不同的结果。
在ES中,使用PUT需要在当前操作索引下指定一个文档ID, 当文档ID不存在时,会进行创建一个文档,如果存在的话,则进行更新,所以在ES里,PUT是具有幂等性,多次执行都能得到同样的结果。
PUT test/_doc/1
{
"text" : "hello word"
}
而如果使用POST创建一个文档,是不需要在当前操作索引下进行指定文档ID(不指定文档ID时,ES则会自动生成一个文档ID),当创建文档不指定文档ID时,当前操作是非幂等,多次执行后,会创建多个文档。
# 创建一个文档,执行多次会创建多个文档
POST test/_doc
{
"text" : "hello word!"
}
# 当指定的文档ID存在,则进行更新,不存在则进行新增
POST test/_doc/1
{
"text" : "hello word!"
}
自动索引创建设置
ES使用Index API创建一个文档时,如果指定索引不存在时,则会默认创建一个索引。
// 创建一个文档ID为1,当 'test' 索引不存在时,则会自动创建一个索引,并添加一个文档
PUT test/_doc/1
{
"text" : "hello word"
}
当不需要自动创建索引时,也可以通过设置配置项action.auto_create_index
进行控制,该配置默认为true
,可以通过以下三种方式进行设置。
// 1:指定自动创建索引规则: 通过在前面加上`-`,`+` 标明禁止和允许自动创建索引
// 支持设置多个索引创建的匹配规则,多个用逗号隔开
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "twitter,index10,-index1*,+ind*"
}
}
// 2:设置该配置为false则会禁止索引自动创建
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "false"
}
}
// 3: 设置为true,则允许索引自动创建,该配置默认为true
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "true"
}
}
指定创建行为
索引操作还可以通过设置op_type
用于强制执行创建操作,从而实现不存在即添加。
// 当ID为1的文档不存在时,则创建,如果存在则报错
PUT test/_doc/1?op_type=create
{
"text" : "hello word"
}
// `_create` uri 也是一样的效果
PUT test/_create/1
{
"text" : "hello word"
}
指定文档路由(Routing)
文档创建时,ES会通过公式shard_num = hash(_routing) % num_primary_shards。
将文档分配到索引对应的分片,而_routing
的默认值为文档ID
,也可在创建文档时进行指定该文档的路由。
PUT test/_doc?routing=kimchy
{
"text" : "hello word"
}
指定文档路由可以提高搜索效率,因为无需将搜索请求散发到索引中的所有分片,而是可以直接将请求仅发送到指定的路由值的分片进行搜索数据。
参考文档
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/docs-index_.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-routing-field.html





