Elasticsearch 核心技术(四):索引管理、映射管理、文档管理(REST API)

时间:2023-01-12 09:57:26

Elasticsearch 核心技术(四):索引管理、映射管理、文档管理(REST API)

❤️ 个人主页:水滴技术
???? 支持水滴:点赞???? + 收藏⭐ + 留言????
???? 订阅专栏:大数据核心技术从入门到精通


大家好,我是水滴~~

本篇文章主要介绍 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"
}

更多索引设置,请访问:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/index-modules.html#index-modules-settings

映射字段

创建索引时,可以映射字段。

请求:

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操作,分配的文档ID WETPnoUBbyDvl79vwHTp,版本号为 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 教程:从入门到精通
???? 《大数据核心技术从入门到精通

Elasticsearch 核心技术(四):索引管理、映射管理、文档管理(REST API)