四时宝库

程序员的知识宝库

Elasticsearch 创建索引(es创建索引api)

自动创建索引

如果 Elasticsearch 之前尚未创建索引操作,则会自动创建索引,还会自动为特定类型创建动态类型映射。映射本身非常灵活,是无模式的。 新的字段和对象将自动添加到指定类型的映射中。可以通过将配置文件中 action.auto_create_index设置为false来禁用自动创建索引。通过将index.mapper.dynamic设置为false可以禁用自动映射创建。

映射是用来定义如何存储、编制、索引文档和字段的过程。 例如,使用映射来定义:

  • 哪些字符串字段应被视为全文字段。

  • 哪些字段包含数字,日期或地理位置。

  • 文档中所有字段的值是否应该编入catch-all 字段(将所有其他字段的值连接成一个大字符串,使用空格作为分隔符,然后对其进行分析和索引,但不存储)。

  • 日期值的格式。

  • 自定义规则来控制动态添加字段的映射。

可以在不指定id的情况下执行索引操作。 在这种情况下,将自动生成ID。

例如命令

POST twitter/tweet/

{

"user" : "kimchy",

"post_date" : "2016-11-15T14:12:12",

"message" : "trying out Elasticsearch"

}

版本

每个索引文档都有一个版本号。关联的版本号会作为对索引API请求的响应的一部分返回。当指定版本参数时,索引API可以允许乐观锁并发控制。用于版本控制的一个很好的例子,是执行事务性的读取并更新操作。例如:

PUT twitter/tweet/1?version=2

{

"message" : "elasticsearch now has versioning support, double cool!"

}

注意:版本控制是完全实时的,不受实时搜索操作的影响。如果没有提供版本,则执行该操作时不进行任何版本检查。

默认情况下,使用内部版本控制,从1开始,每次更新、删除都会增加。可选功能:可以使用外部值补充版本号(例如,在数据库中保留版本号)。要启用此功能,应将version_type设置为external。提供的值必须是长整数(long),大于或等于0,小于9.2e + 18。

当使用外部版本类型时,系统不再检查匹配的版本号,而是将检查请求的版本号是否大于当前存储的文档的版本。如果大于,则文档将被索引并使用新的版本号。如果提供的值小于或等于存储的文档的版本号,则将发生版本冲突,索引操作将失败。

一个好的效果是,只要使用源数据库的版本号,就不需要 执行更改等异步索引操作进行严格排序。 即使用外部版本控制,可以简化数据的更新索引情况。因为如果索引操作因为某些原因而无序,只要使用最新版本即可。

常用版本号类型

  • 内部

仅当给定版本与存储文档的版本相同,才对文档编制索引。

  • 外部

仅当给定版本严格高于存储文档的版本,或者现在没有文档,则对文档建检索。 给定版本号将被用作新版本号,并将与新文档一起存储。 提供的版本必须是非负长整数。

路由

默认情况下,分片路由 是 通过使用文档 ID 值的哈希来控制的。 为了更明确的控制,可以使用routing参数,在每个操作上直接指定路由器使用的散列函数的值。 例如:

POST twitter/tweet?routing=kimchy

{

"user" : "kimchy",

"post_date" : "2009-11-15T14:12:12",

"message" : "trying out Elasticsearch"

}

在上面的示例中,“tweet”文档根据提供的路由参数路由到分片:“kimchy”。

索引操作通过其路由指向主分片,在包含此分片的实际节点上执行操作。 在主分片完成操作之后,如果需要,将更新分发到相关的副本。

为了提高系统的写入可用性,索引操作可以配置为等待一定数量的副本拷贝成功,再继续操作。如果所需数量的副本不可用,则写入操作必须等待并重试,直到必需的分片副本已成功或发生超时为止。默认情况下,写入操作只等待主分片处于完成状态(即wait_for_active_shards = 1)。通过设置index.write.wait_for_active_shards可以动态地在索引设置中覆盖此默认值。要更改每个操作的这种行为,可以使用请求参数 wait_for_active_shards。参数的有效值包括:全部 或 任何正整数,从1 到索引中的每个分片的配置副本总数(即number_of_replicas + 1)。指定一个负值或大于分片数量的数字将会引发错误。

举个例子,假设我们有三个节点A,B和C的集群。我们创建一个索引索引,副本数设置为3(实际是4个副本,比节点多一个副本)。如果我们尝试索引操作,则默认情况下,操作将仅在确保 每个分片的主副本可用。这意味着即使B和C 死机,A托管了主分片副本,索引操作仍完成。如果在请求上设置了wait_for_active_shards到3(并且所有3个节点都已经启动),则索引操作在进行之前,需要3个活动分片副本,这是需要满足的要求,因为集群中有3个活动节点,每个持有副本。但是,如果我们将wait_for_active_shards设置为所有(all 或4,这是相同的),索引操作将不会继续进行,因为我们没有处于活动状态的 4个副本。除非在集群中引入新节点以托管分片的第4个副本,否则操作将超时。

要注意的是,这种设置大大降低了写入操作没有写入必需数量副本的机会,但是并不能完全消除这种可能性,因为这种检查是在写操作开始之前发生的。一旦写入操作正在进行中,仍然有可能在主分片成功, 在任何数量的分片副本上复制失败。

超时

主分片在执行索引操作时可能不可用。 原因可能是主分片正在恢复中 或正在重新定位。 默认情况下,索引操作将最多等待主分片1分钟,然后才会 进行响应返回错误。 timeout参数可用于指定等待时间。 以下是将其设置为5分钟的示例:

PUT twitter/tweet/1?timeout=5m

{

"user" : "kimchy",

"post_date" : "2009-11-15T14:12:12",

"message" : "trying out Elasticsearch"

}

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接