❤️ 个人主页:水滴技术
???? 支持水滴:点赞???? + 收藏⭐ + 留言????
???? 订阅专栏:大数据核心技术从入门到精通
大家好,我是水滴~~
本篇文章主要介绍 Elasticsearch 关于索引、映射和文档的管理。每个请求都会有配套示例,可以当成工具书查看。
一、索引管理
1. 创建索引
创建一个索引,使用的请求为 PUT /<index>
,其中 <index>
为索引名称。同时,还可以指定如下内容:索引的设置 settings
、索引中字段的映射 mappings
、索引的别名 aliases
。
下面通过一些示例来演示如何创建索引:
创建一个索引
请求:
PUT /my-index-000001
响应:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "my-index-000001"
}
其中 acknowledged
表示在超时之前,集群中是否成功创建了索引;而 shards_acknowledged
表示在超时之前,索引中的每个分区是否启动了所需数据的分区副本。
索引设置
创建索引时,可以对更改索引设置。
请求:
PUT /my-index-000002
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
}
number_of_shards
为该索引的分区数,默认值为1;number_of_replicas
为所有主分区的副本数,默认值为1。
可以简写:
PUT /my-index-000002
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 2
}
}
响应:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "my-index-000002"
}
映射字段
创建索引时,可以映射字段。
请求:
PUT /my-index-000003
{
"mappings": {
"properties": {
"field1": {"type": "boolean"},
"field2": {"type": "text"}
}
}
}
响应:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "my-index-000003"
}
别名
创建索引时,还可以为该索引设置别名,并且可以添加多个别名。
请求:
PUT /my-index-000004
{
"aliases": {
"alias_1": {}
}
}
响应:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "my-index-000004"
}
2. 获取索引
获取一个索引,可以使用 GET /<target>
请求,其中 <target>
为索引名称。
请求:
GET /my-index-000003
响应:
{
"my-index-000003" : {
"aliases" : { },
"mappings" : {
"properties" : {
"field1" : {
"type" : "boolean"
},
"field2" : {
"type" : "text"
}
}
},
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "my-index-000003",
"creation_date" : "1672816886070",
"number_of_replicas" : "1",
"uuid" : "J50MtHoeTa-2T6ugNxIQ7Q",
"version" : {
"created" : "7120199"
}
}
}
}
}
3. 删除索引
删除索引同时也会删除其文档、分区和元数据。可以使用 DELETE /<index>
请求,其中 <index>
为索引名称。
请求:
DELETE /my-index-000004
响应:
{
"acknowledged" : true
}
4. 判断索引是否存在
可以使用 HEAD <target>
请求来检查索引是否存在,其中 <target>
为索引名或别名。
请求:
HEAD /my-index-000003
存在 - 响应:
200 - OK
不存在 - 响应:
{"statusCode":404,"error":"Not Found","message":"404 - Not Found"}
二、映射管理
1. 获取映射
可能通过 GET /<target>/_mapping
请求来查询一个索引的映射,其中 <target>
为索引名称。
请求:
GET /my-index-000003/_mapping
响应:
{
"my-index-000003" : {
"mappings" : {
"properties" : {
"field1" : {
"type" : "boolean"
},
"field2" : {
"type" : "text"
}
}
}
}
}
如果索引没有添加映射字段,结果中的 mappings
后面为空。
2. 添加映射字段
我们知道,创建索引时可以添加映射字段,如果创建完索引再添加别的索引,可以使用PUT /<target>/_mapping
命令,其中 <target>
为索引名称。
请求:
PUT /my-index-000003/_mapping
{
"properties": {
"field3": {
"type": "keyword"
},
"field4": {
"type": "text"
}
}
}
响应:
{
"acknowledged" : true
}
三、文档管理
1. 创建文档
创建文档有多种方式:
POST /<target>/_doc/
通过该请求可以创建一个文档,文档ID由 Elasticsearch 自动分配。其中 <target>
为索引名称
请求:
POST /my-index-000003/_doc
{
"field1": true,
"field2": "第一个",
"field3": "1",
"field4": "第一个field4"
}
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "WETPnoUBbyDvl79vwHTp",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 8,
"_primary_term" : 1
}
通过响应结果可以看出,该结果为
created
操作,分配的文档IDWETPnoUBbyDvl79vwHTp
,版本号为1
POST /<target>/_create/<_id>
如果想要指定文档ID,可以使用该请求,其中<target>
为索引名称,<_id>
为指定的文档ID。注:如果文档 ID 已存在,则执行失败。
请求:
POST /my-index-000003/_create/2
{
"field1": true,
"field2": "第二个",
"field3": "2",
"field4": "第二个field4"
}
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 9,
"_primary_term" : 1
}
PUT /<target>/_create/<_id>
也可以使用该 PUT
方法来创建文档,效果与 POST /<target>/_create/<_id>
一样。
请求:
PUT /my-index-000003/_create/3
{
"field1": false,
"field2": "第三个",
"field3": "3",
"field4": "第三个field4"
}
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "3",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 10,
"_primary_term" : 1
}
PUT /<target>/_doc/<_id>
该方式可以指定文档ID,其中<target>
为索引名称,<_id>
为指定的文档ID
请求:
PUT /my-index-000003/_doc/4
{
"field1": false,
"field2": "第四个",
"field3": "4",
"field4": "第四个field4"
}
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "4",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 11,
"_primary_term" : 1
}
如果检测到该文档ID已存在,会覆盖原内容,并且版本
+1
请求:
PUT /my-index-000003/_doc/4
{
"field1": false,
"field2": "第四个_2",
"field3": "4",
"field4": "第四个field4_2"
}
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "4",
"_version" : 2,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 12,
"_primary_term" : 1
}
从响应结果可以看出是updated
操作,并且版本升级到了2
2. 修改文档
修改文档可以使用POST /<index>/_update/<_id>
方法,该修改可以指定字段进行局部更新。
POST /<index>/_update/<_id>
更新文档字段值
可以局部更新指定字段的值。注意:更新的字段需要在doc
对象下。
请求:
POST /my-index-000003/_update/4
{
"doc": {
"field2": "第四个_4",
"field4": "第四个field4_4"
}
}
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "4",
"_version" : 4,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 14,
"_primary_term" : 1
}
添加文档字段
为该文档添加一个新的字段,并指定字段值。
请求:
POST /my-index-000003/_update/4
{
"script": "ctx._source.new_field = 'new_field_value'"
}
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "4",
"_version" : 12,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 22,
"_primary_term" : 1
}
删除文档字段
为该文档删除一个指定字段。
请求:
POST /my-index-000003/_update/4
{
"script": "ctx._source.remove('new_field_value')"
}
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "4",
"_version" : 13,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 23,
"_primary_term" : 1
}
3. 获取文档
获取文档有两种方式
GET <index>/_doc/<_id>
该方法获取文档的详细数据信息
请求:
GET /my-index-000003/_doc/4
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "4",
"_version" : 13,
"_seq_no" : 23,
"_primary_term" : 1,
"found" : true,
"_source" : {
"field1" : false,
"field2" : "第四个_2",
"field3" : "4",
"field4" : "第四个field4_2",
"new_field" : "new_field_value"
}
}
GET <index>/_source/<_id>
该方法只获取文档字段数据信息
请求:
GET /my-index-000003/_source/4
响应:
{
"field1" : false,
"field2" : "第四个_2",
"field3" : "4",
"field4" : "第四个field4_2",
"new_field" : "new_field_value"
}
4. 判断文档是否存在
判断文档是否存在有两个方式,他们的效果是一样的
HEAD <index>/_doc/<_id>
HEAD <index>/_source/<_id>
请求:
HEAD /my-index-000003/_doc/4
响应(存在):
200 - OK
请求:
HEAD /my-index-000003/_source/5
响应(不存在):
{"statusCode":404,"error":"Not Found","message":"404 - Not Found"}
5. 删除文档
可以使用 DELETE /<index>/_doc/<_id>
方法来删除指定文档。删除会将该文档标记为已删除,并且版本号+1
。
请求:
DELETE /my-index-000003/_doc/3
响应:
{
"_index" : "my-index-000003",
"_type" : "_doc",
"_id" : "3",
"_version" : 2,
"result" : "deleted",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 26,
"_primary_term" : 1
}
四、总结
-
PUT /<index>
创建索引 -
GET /<target>
获取索引 -
DELETE /<index>
删除索引 -
HEAD <target>
判断索引是否存在 -
GET /<target>/_mapping
获取映射 -
PUT /<target>/_mapping
修改映射字段 -
POST /<target>/_doc/
创建文档 -
POST /<target>/_create/<_id>
创建文档 -
PUT /<target>/_create/<_id>
创建文档 -
PUT /<target>/_doc/<_id>
创建/覆盖文档 -
POST /<index>/_update/<_id>
更新文档 -
GET <index>/_doc/<_id>
获取文档 -
GET <index>/_source/<_id>
获取文档 -
HEAD <index>/_doc/<_id>
判断文档是否存在 -
HEAD <index>/_source/<_id>
判断文档是否存在 -
DELETE /<index>/_doc/<_id>
删除文档
系列文章
???? Elasticsearch 核心技术(一):Elasticsearch 安装、配置、运行(Windows 版)
???? Elasticsearch 核心技术(二):elasticsearch-head 插件安装和使用
???? Elasticsearch 核心技术(三):Kibana 安装、配置、运行(Windows 版)
热门专栏
???? 《Python入门核心技术》
???? 《IDEA 教程:从入门到精通》
???? 《Java 教程:从入门到精通》
???? 《MySQL 教程:从入门到精通》
???? 《大数据核心技术从入门到精通》