ElasticSearch 6.3版本 Document APIs之Index API(索引API)

Index API(索引API)
在特定索引中添加或更新类型化的JSON文档,使其可搜索。e.g.将JSON文档插入到“twitter”索引中,名为“_doc"且ID为1的类型下:
PUT twitter/_doc/1
{
"user":"kimchy",
"post_date":"2009-11-15T14:12:12",
"message":"trying out Elasticsearch"
}
操作结果如下:
{
“_ shards”:{
“total”:2,
“failed”:0,“success”: 2
},
“_ index”
:“twitter”,“_ type”:“_ doc”,
“ _ id ”:“1”,
“ _version“:1,
”_ seq_no“:0,
”_ primary_term“:1,
”result“:”created“
}
其中,_shards报头提供关于索引操作的复制过程信息:
  • total - 指示应执行索引操作的分片副本(主分片和副本分片)的数量;
  • successful - 表示索引操作成功的分片副本数;
  • failed - 在副本分片上索引操作失败的情况下包含复制相关错误的数组。
索引操作成功的情况successful至少为1。

索引操作成功返回时,可能无法全部启动副本分片(默认情况下,只需要主分区,但可以更改此行为)。在这种情况下, total 将等于基于number_of_replicas设置的总分片successful 数,并且将等于已启动的分片数(主要副本和副本)。如果没有失败,则为failed 0。

自动创建索引
之前未创建索引,则索引操作会自动创建索引,并自动为特定类型创建动态类型映射。

可以通过在所有节点的配置文件中设置action.auto_create_index 禁用自动创建,通过将per-index设置index.mapper.dynamic为false索引设置可禁用自动映射创建。

自动索引创建可包括基于模式的白/黑列表,如设置action.auto_create_index为+aaa*,-bbb*,+ccc*,-*(+表示允许,-表示不允许)。

版本控制
每个索引文档都有一个版本号version,索引API允许在指定参数时进行乐观并发控制version。e.g.
PUT twitter/_doc/1?version=2
{
"message":"elasticsearch now has versioning support , double cool !"
}
注:版本控制是完全实时的,并且不受搜索操作的近实时方面的影响。如果未提供版本,则执行该操作而不进行任何版本检查。

默认情况下,使用从1开始的内部版本控制,并随每次更新而增加,包括删除。版本号也可以用外部值进行补充(如在数据库中维护)。要启用此功能,version_type设为external。提供的值必须是数字长度大于或等于0,小于约9.2e+18。使用外部版本类型时,系统会检查传递给索引请求的版本号是否大于当前存储文档的版本,而不是检查匹配的版本号。如果为true,则将索引文档并使用新版本号;若提供的值小于或等于存储文档版本号,则发生版本冲突,索引操作失败。

WARNING:外部版本控制支持值0作为有效版本号。这允许版本与外部版本控制系统同步,其中版本号从零而不是一开始。它具有副作用,版本号等于零的文档既不能使用Update-By-Query API更新,也不能使用Delete By Query API删除,只要它们的版本号等于零即可。

一个好的副作用是,只要使用源数据库中的版本号,就不需要维护由于源数据库更改而执行的异步索引操作的严格排序。如果使用外部版本控制,即使使用数据库中的数据更新Elasticsearch索引的简单情况也会简化,因为如果索引操作由于某种原因而无序,则仅使用最新版本。

版本类型
不同版本类型及其语义概述:
internal:若给定的版本与存储文档版本相同,则仅索引文档。

external or external_gt:若给定版本严格高于存储文档版本或没有现有文档,则仅索引文档。给定版本用作新版本,并与新文档一起存储,提供的版本必须是非负长号。

external_gte:仅在给定版本等于或高于存储文档的版本时索引文档。若没有现有文档,操作也将成功。给定版本将用作新版本,并将与新文档一起存储。提供版本必须是非负长号。

注:external_gte版本类型适用于特殊用例,使用不当会导致数据丢失。还有另一个选项,force已被弃用,因为它可能导致主分片和副本分片发散。

操作类型
索引操作还接受op_type可用于强制create操作的操作,允许“put-if-absent"行为。当create使用时,如果该ID在文档中的索引已经存在,索引操作将失败。e.g.
PUT twitter/_doc/1?op_type=create
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
另一个指定选项create是使用以下URI:(此方法在ES6.3版本中不适用,官方文档暂时未修正18.7.9)
PUT twitter/_doc/1/_create
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}

自动ID生成
不指定id情况下执行索引操作,将自动生成id。op_type将自动设置为create。e.g.(注意使用POST而不是PUT)
POST twitter/_doc/
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
上述操作响应结果:
{
"_shards" : {
"total" : 2,
"failed" : 0,
"successful" : 2
},
"_index" : "twitter",
"_type" : "_doc",
"_id" : "W0tpsmIBdwcYyG50zbta",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"result": "created"
}

路由
默认情况下,分片放置或routing-通过使用文档的id值的散列进行控制。更明确的控制通过使用routing参数在每个操作基础上指定输入到路由器使用的散列函数的值。e.g.
POST twitter/_doc?routing=kimchy
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}
上述示例中,“_doc”文档根据提供的routing参数路由到分片:“kimchy”

设置显示映射时,_routing可选择使用该字段指示索引操作从文档本身提取路由值。若_routing映射已定义并设置为required,则若未提供或提取路由值,则索引操作将失败。

Noop更新编辑
使用索引api更新文档时,即使文档未更改,也始终会创建新版本的文档。如果这是不可接受的,请使用设置为true 的_updateapi detect_noop。索引api上没有此选项,因为索引api不会获取旧源,也无法将其与新源进行比较。

关于何时不接受noop更新,没有一条硬性规定。它是许多因素的组合,例如您的数据源发送实际noops更新的频率以及Elasticsearch在接收更新时在分片上运行的每秒查询数。

超时编辑
执行索引操作时,分配用于执行索引操作的主分片可能不可用。造成这种情况的一些原因可能是主分片当前正在从网关恢复或正在进行重定位。默认情况下,索引操作将在主分片上等待最多1分钟,然后失败并响应错误。该timeout参数可用于显式指定等待的时间。以下是将其设置为5分钟的示例:
PUT twitter/_doc/1?timeout=5m
{
"user" : "kimchy",
"post_date" : "2009-11-15T14:12:12",
"message" : "trying out Elasticsearch"
}

猜你喜欢

转载自blog.csdn.net/qingmou_csdn/article/details/80931734
今日推荐