创建索引 API编辑

创建一个新的索引。

resp = client.indices.create(
    index="my-index-000001",
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001'
)
puts response
PUT /my-index-000001

请求编辑

PUT /<index>

先决条件编辑

  • 如果启用了 Elasticsearch 安全功能,您必须对目标索引拥有 create_indexmanage 索引权限。要将索引添加到别名,您必须对别名拥有 manage 索引权限。

描述编辑

您可以使用创建索引 API 将新索引添加到 Elasticsearch 集群。创建索引时,您可以指定以下内容

  • 索引设置
  • 索引中字段的映射
  • 索引别名

路径参数编辑

<index>

(必填,字符串) 您要创建的索引的名称。

索引名称必须符合以下条件

  • 仅限小写
  • 不能包含 \/*?"<>|、` `(空格字符)、,#
  • 7.0 之前的索引可以包含冒号 (:),但这已弃用,在 7.0+ 中将不再支持
  • 不能以 -_+ 开头
  • 不能是 ...
  • 不能超过 255 个字节(注意是字节,所以多字节字符将更快地达到 255 个字节的限制)
  • . 开头的名称已弃用,但 隐藏索引 和插件管理的内部索引除外

查询参数编辑

wait_for_active_shards

(可选,字符串) 在继续操作之前必须处于活动状态的分片副本数量。设置为 all 或任何正整数,直到索引中的分片总数 (number_of_replicas+1)。默认值:1,主分片。

请参阅 活动分片

master_timeout
(可选,时间单位) 等待主节点的时间段。如果在超时时间到期之前主节点不可用,则请求失败并返回错误。默认值为 30s。也可以设置为 -1,表示请求永远不会超时。
timeout
(可选,时间单位) 等待响应的时间段。如果在超时时间到期之前未收到响应,则请求失败并返回错误。默认值为 30s

请求正文编辑

aliases

(可选,对象的对象) 索引的别名。

aliases 对象的属性
<alias>

(必填,对象) 键是别名名称。索引别名名称支持 日期数学

对象正文包含别名的选项。支持空对象。

<alias> 的属性
filter
(可选,查询 DSL 对象) 用于限制别名可以访问的文档的查询。
index_routing
(可选,字符串) 用于将索引操作路由到特定分片的 value。如果指定,这将覆盖索引操作的 routing value。
is_hidden
(可选,布尔值) 如果为 true,则别名是 隐藏的。默认值为 false。别名的所有索引必须具有相同的 is_hidden value。
is_write_index
(可选,布尔值) 如果为 true,则索引是别名的 写入索引。默认值为 false
routing
(可选,字符串) 用于将索引和搜索操作路由到特定分片的 value。
search_routing
(可选,字符串) 用于将搜索操作路由到特定分片的 value。如果指定,这将覆盖搜索操作的 routing value。
mappings

(可选,映射对象) 索引中字段的映射。如果指定,此映射可以包含

请参阅 映射

settings
(可选,索引设置对象) 索引的配置选项。请参阅 索引设置

示例编辑

索引设置编辑

每个创建的索引都可以具有与其关联的特定设置,这些设置在正文中定义

resp = client.indices.create(
    index="my-index-000001",
    body={
        "settings": {
            "index": {"number_of_shards": 3, "number_of_replicas": 2}
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      index: {
        number_of_shards: 3,
        number_of_replicas: 2
      }
    }
  }
)
puts response
PUT /my-index-000001
{
  "settings": {
    "index": {
      "number_of_shards": 3,  
      "number_of_replicas": 2 
    }
  }
}

number_of_shards 的默认值为 1

number_of_replicas 的默认值为 1(即每个主分片一个副本)

或更简化的

resp = client.indices.create(
    index="my-index-000001",
    body={"settings": {"number_of_shards": 3, "number_of_replicas": 2}},
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001',
  body: {
    settings: {
      number_of_shards: 3,
      number_of_replicas: 2
    }
  }
)
puts response
PUT /my-index-000001
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

您不必在 settings 部分中显式指定 index 部分。

有关创建索引时可以设置的所有不同索引级别设置的更多信息,请查看 索引模块 部分。

映射编辑

创建索引 API 允许提供映射定义

resp = client.indices.create(
    index="test",
    body={
        "settings": {"number_of_shards": 1},
        "mappings": {"properties": {"field1": {"type": "text"}}},
    },
)
print(resp)
response = client.indices.create(
  index: 'test',
  body: {
    settings: {
      number_of_shards: 1
    },
    mappings: {
      properties: {
        "field1": {
          type: 'text'
        }
      }
    }
  }
)
puts response
res, err := es.Indices.Create(
	"test",
	es.Indices.Create.WithBody(strings.NewReader(`{
	  "settings": {
	    "number_of_shards": 1
	  },
	  "mappings": {
	    "properties": {
	      "field1": {
	        "type": "text"
	      }
	    }
	  }
	}`)),
)
fmt.Println(res, err)
PUT /test
{
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "field1": { "type": "text" }
    }
  }
}

别名编辑

创建索引 API 还允许提供一组 别名

resp = client.indices.create(
    index="test",
    body={
        "aliases": {
            "alias_1": {},
            "alias_2": {
                "filter": {"term": {"user.id": "kimchy"}},
                "routing": "shard-1",
            },
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'test',
  body: {
    aliases: {
      "alias_1": {},
      "alias_2": {
        filter: {
          term: {
            'user.id' => 'kimchy'
          }
        },
        routing: 'shard-1'
      }
    }
  }
)
puts response
PUT /test
{
  "aliases": {
    "alias_1": {},
    "alias_2": {
      "filter": {
        "term": { "user.id": "kimchy" }
      },
      "routing": "shard-1"
    }
  }
}

索引别名名称也支持 日期数学

resp = client.indices.create(
    index="logs",
    body={"aliases": {"<logs_{now/M}>": {}}},
)
print(resp)
response = client.indices.create(
  index: 'logs',
  body: {
    aliases: {
      "<logs_{now/M}>": {}
    }
  }
)
puts response
PUT /logs
{
  "aliases": {
    "<logs_{now/M}>": {}
  }
}

等待活动分片编辑

默认情况下,索引创建只会当每个分片的主副本启动或请求超时时才向客户端返回响应。索引创建响应将指示发生了什么

{
  "acknowledged": true,
  "shards_acknowledged": true,
  "index": "logs"
}

acknowledged 指示索引是否已成功在集群中创建,而 shards_acknowledged 指示在超时之前是否已为索引中的每个分片启动了必需数量的分片副本。请注意,acknowledgedshards_acknowledged 仍然可能为 false,但索引创建已成功。这些值只是指示操作是否在超时之前完成。如果 acknowledgedfalse,则我们在集群状态使用新创建的索引更新之前超时,但它很可能很快就会被创建。如果 shards_acknowledgedfalse,则我们在启动必需数量的分片之前超时(默认情况下只是主分片),即使集群状态已成功更新以反映新创建的索引(即 acknowledged=true)。

我们可以通过索引设置 index.write.wait_for_active_shards 更改仅等待主分片启动的默认值(请注意,更改此设置也会影响所有后续写入操作的 wait_for_active_shards value)

resp = client.indices.create(
    index="test",
    body={"settings": {"index.write.wait_for_active_shards": "2"}},
)
print(resp)
response = client.indices.create(
  index: 'test',
  body: {
    settings: {
      'index.write.wait_for_active_shards' => '2'
    }
  }
)
puts response
res, err := es.Indices.Create(
	"test",
	es.Indices.Create.WithBody(strings.NewReader(`{
	  "settings": {
	    "index.write.wait_for_active_shards": "2"
	  }
	}`)),
)
fmt.Println(res, err)
PUT /test
{
  "settings": {
    "index.write.wait_for_active_shards": "2"
  }
}

或通过请求参数 wait_for_active_shards

$params = [
    'index' => 'test',
];
$response = $client->indices()->create($params);
resp = client.indices.create(
    index="test",
    wait_for_active_shards="2",
)
print(resp)
response = client.indices.create(
  index: 'test',
  wait_for_active_shards: 2
)
puts response
res, err := es.Indices.Create("test?wait_for_active_shards=2")
fmt.Println(res, err)
const response = await client.indices.create({
  index: 'test',
  wait_for_active_shards: '2'
})
console.log(response)
PUT /test?wait_for_active_shards=2

有关 wait_for_active_shards 及其可能值的详细说明,请参阅 此处