创建索引 API

编辑

创建一个新的索引。

resp = client.indices.create(
    index="my-index-000001",
)
print(resp)
response = client.indices.create(
  index: 'my-index-000001'
)
puts response
const response = await client.indices.create({
  index: "my-index-000001",
});
console.log(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。也可以设置为 -1 以指示请求永不超时。

请求正文

编辑
aliases

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

aliases 对象的属性
<alias>

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

对象主体包含别名的选项。支持空对象。

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

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

请参阅 映射

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

示例

编辑

索引设置

编辑

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

resp = client.indices.create(
    index="my-index-000001",
    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
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    index: {
      number_of_shards: 3,
      number_of_replicas: 2,
    },
  },
});
console.log(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",
    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
const response = await client.indices.create({
  index: "my-index-000001",
  settings: {
    number_of_shards: 3,
    number_of_replicas: 2,
  },
});
console.log(response);
PUT /my-index-000001
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  }
}

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

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

映射

编辑

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

resp = client.indices.create(
    index="test",
    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)
const response = await client.indices.create({
  index: "test",
  settings: {
    number_of_shards: 1,
  },
  mappings: {
    properties: {
      field1: {
        type: "text",
      },
    },
  },
});
console.log(response);
PUT /test
{
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "properties": {
      "field1": { "type": "text" }
    }
  }
}

别名

编辑

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

resp = client.indices.create(
    index="test",
    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
const response = await client.indices.create({
  index: "test",
  aliases: {
    alias_1: {},
    alias_2: {
      filter: {
        term: {
          "user.id": "kimchy",
        },
      },
      routing: "shard-1",
    },
  },
});
console.log(response);
PUT /test
{
  "aliases": {
    "alias_1": {},
    "alias_2": {
      "filter": {
        "term": { "user.id": "kimchy" }
      },
      "routing": "shard-1"
    }
  }
}

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

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

等待活动分片

编辑

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

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

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

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

resp = client.indices.create(
    index="test",
    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)
const response = await client.indices.create({
  index: "test",
  settings: {
    "index.write.wait_for_active_shards": "2",
  },
});
console.log(response);
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 及其可能值的详细说明。