自动创建索引
如果索引不存在,index操作将自动创建索引,并应用已配置的任何索引模板。如果动态映射不存在,也会创建动态映射。默认情况下,新的字段和对象会自动添加到映射中。自动创建索引控制由action.auto_create_index设置。默认为true,表示总是自动创建索引。如果为false,表示完全禁用自动创建索引。此外,还可以将action.auto_create_index的值设置为逗号分隔的列表,列表中的项接受通配符表达式,这样只有当索引与列表中的某项匹配时才允许自动创建索引。还可以通过给列表中的项增加前缀“+”或“-”来显示的设置允许或禁止自动创建索引。
等待活动分片
索引操作根据其路由定向到主分片,并在包含该分片的实际节点上执行。主分片操作完成后,如果需要,更新将分发到合适的副本。为了提高对系统的写操作的弹性,可以将索引操作设置为在继续操作之前等待一定数量的活动分片副本。如果没有所需数量的活动分片副本,则写操作必须等待并重试,直到所需的分片副本已经启动或超时。默认情况下,写操作只等待主分片处于活动状态后才继续。可通过index设置中的index.write.wait_for_active_shards动态的覆盖默认值。如果要更改所有操作的设置,可以使用wait_for_active_shards参数。合法值为all或者索引中配置的每个分片的总副本数以内的任何正整数即number_of_replicas+1,如果为负数或大于分片副本数量的数字会产生错误。需要注意的是,这个设置极大地减少了写入操作没有写入到所需的分片副本数量的机会,但是并没有完全消除这种可能性,因为这个检查是在写入操作开始之前进行的。在执行写操作之后,仍然有可能在任意数量的副本分片上复制失败,但在主分片仍然成功。写操作响应的_shards部分显示了复制成功/失败的分片副本的数量。
路由
默认情况下,文档的分片位置是通过使用文档id值的hash值来控制的。如果想要显示控制,可以通过routing参数在每个操作的基础上直接指定路由器使用的hash函数的输入。当设置显示映射时,可以选择使用_routing字段来指示索引操作从文档本身提取路由值。如果定义了_routing映射并设置为必需的,则当没有提供或提取到路由值,索引操作会失败。
无操作更新
在使用Index API更新文档时,即使文档没有更改,也总是会创建文档的新版本。如果不希望这样,可以使用Update API,并将detect_noop设置为true。此设置在Index API上不可用,因为Index API不会获取旧的源信息,不能与新的源信息进行比较。
超时
在执行索引操作时,分配的执行索引操作的主分片可能不可用。默认情况下,索引操作会等待有一分钟,如果仍不可用则操作失败并返回错误。可以使用timeout参数显示指定超时时间。
版本管理
每个索引文档都有一个版本号,默认情况下,使用内部版本控制,从1开始每次更新/删除操作会递增。还可以选择将版本号设置为外部值。要启用此功能,需要将参数version_type设置为external。版本的值必须是一个在[0,9.2e+18)范围内的数字。当使用外部版本类型时,系统检查传递给索引请求的版本号是否大于当前存储文档的版本。如果为true,文档将被索引并使用新版本号。如果提供的值小于或等于存储文档的版本,则会发生版本冲突,索引操作会失败。版本控制是完全实时的,不受近实时搜索的影响。如果不提供版本,则在不进行任何版本检查的情况下执行操作。version_type可选值有:internal(只有给定的版本与存储的文档的版本相同才对文档进行索引)、external/external_gt(只有在给定版本严格高于存储文档的版本或者没有文档时才对文档进行索引)、external_gte(如果给定的版本等于或高于存储文档的版本或者没有文档时才对文档进行索引)。