ES序列 | Index API分析
- 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"
}
指定文档路由可以提高搜索效率,因为无需将搜索请求散发到索引中的所有分片,而是可以直接将请求仅发送到指定的路由值的分片进行搜索数据。
参考文档
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。