Elasticsearch介绍#

Elasticsearh 是 elastic.co 公司开发的分布式搜索引擎。

es client 插入数据_lucene

Elasticsearch(简称ES)是一个开源的分布式、高度可扩展的全文搜索和分析引擎。它能够快速、近乎实时的存储、搜索和分析大量数据。适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型数据。

它通常为具有复杂搜索功能的应用提供底层搜索技术。

当然,它也可以用来实现分布式数据存储、日志统计、分析、系统监控、地理空间查询等功能。

Elasticsearch 最底层的搜索引擎技术是 Apache 基金会开源的搜索引擎类库 Lucene,Lucene 提供了搜索引擎核心 API 。

  • Lucene 地址:Apache Lucene - Welcome to Apache Lucene

ES 在 Lucene 的基础上提供了分布式支持,可以水平扩展,提供了 Restful 这种简洁的访问接口,能被任何语言调用。

  • Elasticsearch 官网:Elastic Observability and Security — built on Elasticsearch | Elastic
  • github:GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine

Elasticsearch能做什么#

  • 应用搜索,常见的 github 的代码搜索,滴滴,美团,点评,银行等各种搜索
  • 网站搜索
  • 日志记录和日志分析
  • 基础设置指标和容器监控
  • 应用性能监控
  • 地理空间数据分析和可视化
  • 商业分析
  • 安全分析

二、ELK 是什么#

ELK 是 ElasticsearchLogstash 和 Kibana 的第一个字母组合,也叫 ELK Stack。是一套用于数据采集、存储、分析和可视化的开源工具集。

  • Elasticsearch:存储、索引、计算、搜索、分析数据。
  • Logstash:用于收集、转换数据,然后将它存储在 ES 中。后面还开发新的收集数据软件 Beats
  • Beats:它是一个轻量级的数据采集代理工具,可以向 Elasticsearch 发送数据。
  • Kibana:用于查询分析、可视化 ES 的数据,它还可以用于监控和报警的方案。它是 Elasticsearch 基于浏览器的分析和搜索仪表盘。

它们之间关系图:

es client 插入数据_数据_02

(来自:Elasticsearch 简介

把上面的图简化下:

es client 插入数据_搜索引擎_03

三、ES中的基础概念#

文档document#

Elasticsearch 是面向文档,它可以存储整个对象或文档。它不仅仅是存储,还会索引每个文档的内容使之可以被搜索。在 ES 中,你可以对文档进行索引、搜索、排序、过滤。

在 ES 中,文档是索引信息的基本单位。

JSON#

Elasticsearch 使用 json 格式作为文档序列化格式。这种格式在 NoSQL 数据库中使用比较多。

一个 json 对象是由 key 和 value 组成。key 是字段(field)或属性(property)的名字,值(value)可以是字符串、数字、布尔类型、另外一个对象、值数组或其他特殊类型,比如表示日期的字符串或表示地理位置的对象。

在关系型数据库中,使用行和列存储数据,比如存储在 MySQL 表中的数据:

id

name

1

比亚迪电动车

2

理想电动车

3

小鹏电动车

4

比亚迪电池

5

理想电池

把上面的数据用 json 格式存储在 elasticsearch 中:



Copy

{ "id": 1, "name": "比亚迪电动车" } { "id": 2, "name": "理想电动车" } { "id": 3, "name": "小鹏电动车" } { "id": 4, "name": "比亚迪电池" } { "id": 5, "name": "理想电池" } 

上面 json 中的字段 id 相当于 MySQL 数据表中列 id。

每个文档就是一条json数据。一条 json 数据相当于 MySQL 表中的一行。

索引index#

index 索引是具有相似特征文档的集合。一个索引通过名字(必须全部是小写)来标识,并且在对其中的文档执行索引、搜索、更新和删除操作时,都会用到这个索引的名字。

索引可以是一个名词,相当于文档存储的地方。

索引也可以是一个动词,索引一个文档表示把一个文档存储到索引里,以便它可以被检索和查询。

例如,你有一个用户数据的索引,索引名称叫 user,每一份用户信息就是一个文档:



Copy

{ "id": 1, "name": "tom", "age": 25 }, { "id": 2, "name": "hanlei", "age": 35 }, { "id": 1, "name": "tom", "age": 25 }, { "id": 3, "name": "hanmeimei", "age": 36 } 

*类型type#

类型 type 这个概念在 elasticsearch 7.X 已被完全移除(参考文档 Removal of mapping types)。这里就不作介绍。

映射mapping#

映射(mapping)是索引文档中字段的类型和字段的其它信息,都存储在映射(mapping)中,它也叫模式定义(schema definition)。

相当于 MySQL 数据表的 schema,如定义表结构、字段名称、字段类型等信息。

而在 ES 中,映射可以设置某个字段的数据类型、默认值、分析器、是否被索引等等,其它处理 ES 里面的数据使用规则设置也叫映射。

mapping还有许多内容请查看文档:Mapping | Elasticsearch Guide [8.4] | Elastic

mapping field doc:Metadata fields | Elasticsearch Guide [8.4] | Elastic

映射的设置:



Copy

{ "mappings": { "properties": { "id": { "type": "keyword" }, "message": { "type": "text" } } } } 

文档元数据#

一个文档不仅仅包含 json 数据,也包含元数据 - 元数据是有关文档信息的一些数据。

创建映射时,可以自定义其中一些元数据字段的行为。例如,创建一个文档:



Copy

// 先创建一个映射mapping关系,相当于MySQL中表的schema,定义json文档中字段的属性 PUT test { "mappings": { "properties": { "id": { "type": "keyword" }, "message": { "type": "text" } } } } 

给文档写入一条数据:



Copy

// 给test索引写入一条json文档数据 PUT test/_doc/1 { "id": "12", "message": "hello world" } 

上面 PUT test/_doc/1 命令会返回一条信息:



Copy

{ "_index" : "test", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1 } 
  • _index:表示文档所属的索引
  • _id:文档唯一标识 ID
  • _source:表示文档 doc 的原生 json 数据
  • _size:整个 _source 字段的字节大小,它是由 mapper-size 插件提供
  • _shards:表示索引的分片数。一个索引可以划分为多个 shards,这样就可以存储更多的数据

更多元数据信息请查看:Metadata fields | Elasticsearch Guide [8.4] | Elastic

分布式集群#

节点node#

一个节点node表示集群中的一台服务器,它作为集群的一部分存储数据,并参与集群的索引和搜索功能。

节点由名称标识,默认情况下是在启动时分配给节点的一个随机 UUID 唯一标识符。如果不想要默认值,可以自定义节点名称。

可以将节点通过集群名称加入特定集群中。默认情况下,每个节点都加入一个名为 “elasticsearch” 的集群中,这意味着如果

网络上启动了多个节点,它们可以相互发现,那么它们将自动形成一个名为 elasticsearch 的集群。

在单个集群中,你可以拥有任意数量的节点。

此外,如果网络上没有其它节点在运行,则会启动单个节点将默认形成一个名为 elasticsearch 的新节点集群。

集群cluster#

集群(cluster)是由一个或多个节点node(服务器)组成,它们一起保存全部数据并提供跨所有节点的联合索引和搜索功能。集群由唯一标识符标识,默认为“elasticsearch”。这个名称很重要,因为一个节点被设置为通过名称加入集群时,该节点才能成为集群的一部分。

注意:拥有一个节点的集群也是完全可以的。

此外,你也可以拥有多个独立的集群,每个集群都拥有自己独立的名称。

分片shard和副本replica#

索引可能会存储大量的数据,而这些数据的容量可能会超过单个节点服务器的硬件容量限制。比如,占用 1TB 磁盘空间的 10 亿文档的单个索引可能无法存储在单个节点的磁盘上,因为节点磁盘容量不足以容纳下这么大容量的数据,或者速度太慢无法满足来自单个节点的搜索速度请求。

  • 这些问题怎么解决?

Elasticsearch 可以将索引的数据进行分割,这些分割的部分称为分片,每个分片可以分配到不同节点上。

相当于关系型数据中存储数据太多,而进行分库分表操作,把数据进行分散存储。

在 Elasticsearch 中,当你创建索引时,你可以定义想要的分片数量。每个分片都是一个功能齐全、独立的“索引”,可以在集群的任意节点上托管。

  • 分片的好处:
  • 它可以对数据进行水平拆分,扩展存储数据的容量
  • 提供性能、吞吐量,它允许跨分片(可以在多个节点上)分布数据和并行化操作
  • 如果发生网络故障,数据丢了怎么办?

这时就会用到数据副本replica功能。Elasticsearch 允许将索引分片构造复制成一个或多个副本,即所谓的复制分片,简称副本。

这样就提供了 ES 的高可用性,为了高可用,ES 不允许副本分片和主分片(或原始分片)分配在同一节点上。

集群架构图解#

在 ES 中,索引 index 是由多个 json 格式的文档 document 组成的。每个索引 index 又可以划分为多个分片 Shard。

为了保证高可用,一个分片 shard,又可以分为主分片(primary shard)和副分片(replica shard),副分片是对主分片数据的备份,每个主分片可以有多个副分片,也就是说主分片可以有多个备份数据,

es client 插入数据_elasticsearch_04

(每个索引index由多个documen组成)

es client 插入数据_搜索引擎_05

(每个索引index可以划分为多个分片shard,上图划分为shard 1,shard 2,shard 3)

集群 cluster 和节点 Node,主分片 Primary 和副分片 Replica 的关系图:

es client 插入数据_es client 插入数据_06

(上图中虚线框里同颜色表示同一份数据的不同分片,Primary-主分片,和此主分片的副本(Replica - 副分片))

对上面集群图 Cluster 说明:

  • 把一个索引分成 3 个分片(主分片):Primary 1,Primary 2,Primary 3,然后把 3 个主分片分配到 3 个不同节点Node上
  • 每个主分片有 2 个副分片:Replica 1 和 Replica 2,且分别在不同的节点上。比如主分片 Primary 1 在 Node 1 上,它的副分片Replica 1 和 Replica 2 分别在 Node 2 和 Node 3 上

es client 插入数据_lucene_07

(上图:主分片和它所属副分片,副分片是对主分片数据的备份)

ES与关系型数据库对比#

Elasticsearch 与关系型数据库的一个简单类比:

Elasticsearch(ES搜索引擎)

Relational DB(关系型数据库)

Indices(多个索引)

Databases(数据库)

Index(单个索引)

Table(表)

Document(文档)

Row(行)

Field(字段)

Column(列)

Elasticsearch集群可以包含多个索引(indices)(数据库),每一个索引包含多个文档(documents)(行),然后每个文档包含多个字段(Fields)(列)。用于理解 ES 中的概念,作一个简单的类比。

四、数据结构: 倒排索引#

下面介绍 Elasticsearch 中最重要的数据结构之一 - 倒排索引

索引简介#

索引,在生活中最常见的就是书籍的目录,它就是一种类似索引结构,有时我们也叫索引目录,它能让人快速找到书籍相关章节的内容。

在计算机技术中,索引是一种常用的数据结构,目的就是加快查找数据的速度。比如我们常用的 MySQL 数据库,就有多种索引。

在搜索引擎中,面对海量的数据,如何根据关键字词快速找到用户需要的相关内容?

这里就要用到 倒排索引 这种数据结构,这是搜索引擎中最重要的数据结构。

倒排索引#

倒排索引中的一些概念:

  • 文档(document):用来搜索的数据,一般是以文本形式存在的存储对象。比如一条短信,一封邮件等。更广义的还有 Word、PDF、XML 等不同格式的文档。
  • 文档集合(document collection):由若干个文档组成的集合叫文档集合。
  • 文档编号(document id):文档集合中每个文档的唯一编号,用这个唯一编号来标识这个文档。
  • 词条(term):对文档数据,用某种分词算法后,得到的有含义的词语就是词条。例如:我们好好学习,可以用分词算法分为:我们,好好学习,学习等几个词条。
  • 倒排索引(inverted index):倒排索引是实现词条和文档的一种存储形式。通过倒排索引,可以根据词条快速获取包含这个词语的文档列表。

我们平常使用 MySQL 关系型数据库存储数据,里面有数据表。创建一个关于电动车的数据表:

id

name

1

比亚迪电动车

2

理想电动车

3

小鹏电动车

4

比亚迪电池

5

理想电池

怎么把上面的表用倒排索引来表示呢?

词条(term)

文档id(doc id)

比亚迪

1,4

电动车

1,2,3

理想

2,5

小鹏

3

电池

4,5


1,2,3

这张表就是倒排索引。

上面 MySQL 中的表,可以看作是正向索引表,然后把这张表数据倒过来,就变成倒排索引表。

MySQL 表变成倒排索引表的处理过程:

  • 利用分词算法对文档数据进行分词,得到一个一个词条。
  • 创建倒排索引表,每行数据词条、文档id等

倒排索引表的词条具有唯一性,然后可以给词条创建索引加快查询速度,比如哈希表索引。

五、安装ES#

下载并安装ES#

因为我的是windows,所以我下载win的安装包,如果你是其它系统请下载相应平台的。我这里想下载 V8.4.3 版本,下载地址:

但是我电脑上安装的是 JDK 1.8,不适合 8 以上的 ES 版本,见这里说明,JDK 和 ES 的对应版本

后面我换到了能使用jdk 1.8 的 ES V7.17.10 版本。

下载之后直接解压,然后进入 bin 目录,点击 elasticsearch.bat 启动 ES,启动会有一些时间,稍微等一下;

9300 是 tcp 通信端口,ES 集群之间使用 tcp 通信;9200 是 http 协议端口。

在浏览器上输入 http://localhost:9200/ 查看,我这里输出以下数据,安装成功了,



Copy

{ "name": "AIS", "cluster_name": "elasticsearch", "cluster_uuid": "bKg5AkWZScafo0vp03XOyA", "version": { "number": "7.17.10", "build_flavor": "default", "build_type": "zip", "build_hash": "fecd68e3150eda0c307ab9a9d7557f5d5fd71349", "build_date": "2023-04-23T05:33:18.138275597Z", "build_snapshot": false, "lucene_version": "8.11.1", "minimum_wire_compatibility_version": "6.8.0", "minimum_index_compatibility_version": "6.0.0-beta1" }, "tagline": "You Know, for Search" } 

安装elasticsearch-head插件#

elasticsearch-head 插件可以查看 ES 的各种数据。

通过 git clone 下载 head 插件:



Copy

git clone https://github.com/mobz/elasticsearch-head.git cd ./elasticsearch-head npm install npm run start 

浏览器上打开:Node Exporter

es client 插入数据_lucene_08

当然还有其它多种安装方式。

第二种方式 chrome 插件安装:

还可以通过 chrome extension 运行插件,Elasticsearch Head 在 Chrome store 的 下载地址

下载 chrome 插件后,安装到 chrome 浏览器里。

第三种方式 docker 安装:

通过 docker 安装,具体查看:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster

设置跨域:

如果连接不上 ES,需要设置跨域访问,打开配置文件 config/elasticsearch.yml,在最后增加下面配置项:



Copy

http.cors.enabled: true http.cors.allow-origin: "*" 

设置完成后,重新启动 ES。

打开 http://localhost:9100/,然后点击连接按钮,出现下面 green 颜色表示连接成功,如下图:

es client 插入数据_数据_09

六、ES操作-增删改查搜#

使用cURL命令操作ES#

  • curl 操作命令格式

使用 curl,将请求从命令行提交到本地 Elasticsearch 实例,这些请求包含任何 HTTP 请求相同部分:



Copy

curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>' 

命令参数说明:

命令参数

说明

<VERB>

HTTP 方法,例如,GET,POST,PUT,HEAD 或 DELETE

<PROTOCOL>

http 或 https,如果你在 ES 前面有一个 https 代理

<HOST>

Elasticsearch 集群中任何节点的主机名。 或用 localhost 来代表本地机器上的节点

<PORT>

运行 Elasticsearch HTTP 服务的端口号,默认为 9200

<PATH>

API 的终端路径,可以包含多个参数,例如,_cluster/stats

<QUERY_STRING>

任何可选的查询字符串参数。

<BODY>

JSON 编码格式的请求正文,如果有需要

如果 elasticsearch 启动了安全功能,则必须提供有权限运行 API 的有效用户名和密码:



Copy

curl -u elastic:password -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>' // elastic 用户名 // password 密码

  • curl 安装和文档地址

我是win这里用 chocolatey 安装:



Copy

choro install curl

安装完成后直接 cd 到它的安装目录 C:\ProgramData\chocolatey\bin 目录下,然后执行查看 curl 版本命令,安装成功:

不知道安装到哪里了?可以使用 where curl 命令来查询安装位置

es client 插入数据_elasticsearch_10

查询 ES 的 http 服务端口 9200,命令:curl.exe -XGET 'http://localhost:9200' -H 'Content-Type: application/json'

es client 插入数据_搜索引擎_11

这里还可以使用 Go 语言实现的 curl 工具 curlie 来操作 ES。

  • 安装 curlie


Copy

go install github.com/rs/curlie@v1.6.0

用 curlie 在 terminal 上访问 HTTP 端口 9200,我是 win 使用 PowerShell,命令如下:



Copy

curlie -XGET 'http://localhost:9200' -H 'Content-Type: application/json' 

返回结果:

es client 插入数据_搜索引擎_12

如果 ES 设置了用户和密码,可以用如下命令:



Copy

$ curlie -XGET -u "elastic:pwdes" 'http://localhost:9200/' -H 'Content-Type: application/json'

说明:如果运行 curlie 返回安全错误信息,那么找到ES安装位置,然后在 config/elasticsearch.yml 文件最后面加上

xpack.security.enabled: false ,把安全验证设置为 false。

创建索引和文档#

前面说了,索引 index 可以是名词存储文档的地方,也可以是动词创建索引的意思。

创建索引基本语法:



Copy

PUT /{索引名称}

创建索引和文档基本语法:



Copy

PUT /{索引名称}/_doc/文档id // 也可以把上面 PUT 换成 POST

查询索引信息:



Copy

GET /{索引名称}

  • curl创建索引和文档:

例如,创建一个卖书的书店bookmall索引,然后给索引增加一些数据,命令如下:



Copy

curl -XPUT "http://localhost:9200/bookmall/_doc/1?pretty" -H "Content-Type: application/json" -d '{"product_id": 123456, "quantity":

100}'

我的是windows,在cmd下运行后出错,出错信息如下:



Copy

{ "error" : { "root_cause" : [ { "type" : "mapper_parsing_exception", "reason" : "failed to parse" } ], "type" : "mapper_parsing_exception", "reason" : "failed to parse", "caused_by" : { "type" : "json_parse_exception", "reason" : "Unexpected character ('p' (code 112)): was expecting double-quote to start field name\n at [Source: (ByteArrayInputStream); line: 1, column: 3]" } }, "status" : 400 } 

需要把上面的命令修改下,双引号前加上斜线,



Copy

curl -XPUT 'http://localhost:9200/bookmall/_doc/1?pretty' -H 'Content-Type: application/json' -d '{\"product_id\": 123456, \"quantity\": 100}' 

在运行,成功了,返回信息:



Copy

{ "_index" : "bookmall", "_type" : "_doc", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 0, "_primary_term" : 1 } 

在 linux 下就不需要加这条斜线,所以学习建议在 linux 平台下。 - -!

上面的命令 curl -XPUT 也可以换成 curl -XPOST

例如,博客巴士的博客文章,我们可以用 ES 来索引这些博客文章信息。

下面我使用 Postman 这款测试 API 的软件来增加索引,打开 Postman 软件(如没安装请先安装),首先新建一个请求的 tab,

es client 插入数据_搜索引擎_13

然后在 Headers 里加上 Content-Type: application/json ,如下:

es client 插入数据_elasticsearch_14

然后请求方法选择 PUT, url 栏里填上 http://localhost:9200/blogerbus/_doc/1?pretty ,然后点击 body,选择 raw 选项,格式选择 JSON , 填上 json 格式的数据,最后点击 Send 按钮发送数据,如下图:

es client 插入数据_搜索引擎_15

Status:201 Created ,成功返回数据:



Copy

{ "_index": "blogerbus", "_type": "_doc", "_id": "1", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 } 

对这条 URL http://localhost:9200/blogerbus/_doc/1?pretty 的说明:

  • http://localhost:9200:ES HTTP 本地服务端地址:端口号
  • blogerbus:索引名称
  • _doc:文档终端endpoint,ES 里的一个固定字段
  • 1:文档 id
  • ?pretty:将返回的json格式化数据,显示为更易于让人阅读的形式

查询索引index文档#

基本语法:



Copy

// 根据单个id查询 GET /{索引名称}/_doc/文档id //批量查询:查询该索引库下的全部文档 GET /{索引名称}/_search // 查询某个索引详细信息 GET /{索引名称} // 查询所有索引部分信息 GET /_cat/indices 
  • Postman 查询

用 Postman 来查询索引文档,在url栏输入 http://localhost:9200/blogerbus/_doc/1?pretty=true,点击 Send,返回:

es client 插入数据_数据_16

返回内容:



Copy

{ "_index": "blogerbus", "_type": "_doc", "_id": "1", "_version": 1, "_seq_no": 0, "_primary_term": 1, "found": true, "_source": { "user": "lilei", "create_at": "2021-09-15T08:12:43", "title": "hello world", "article": "hello world, this is good thing" } } 
  • curl查询索引信息


Copy

// 查询单个索引详细信息 curl -XGET 'http://localhost:9200/bookmall?pretty' -H 'Content-Type:application/json' // 查询 ES 中的所有索引部分信息 curl -XGET 'http://localhost:9200/_cat/indices?pretty' -H 'Content-Type:application/json' 

搜索#

基本语法:



Copy

GET /{索引名称}/_search // 后面可以跟一些查询字符串,也可以跟json的DSL 

给索引 blogerbus 多增加几个文档,用于我们的搜索:



Copy

// 第2篇文档,http://localhost:9200/blogerbus/_doc/2?pretty { "user": "lilei", "create_at": "2021-09-18T09:12:04", "title": "math lesson", "article": "hello math, this my first lesson" } // 第3篇文档,http://localhost:9200/blogerbus/_doc/3?pretty { "user": "hanmeimei", "create_at": "2021-10-10T03:24:34", "title": "test lesson", "article": "hello lesson, this my test lesson" } 
  • Postman 搜索

搜索 user 为 lilei 的所有文章,在 Postman 的url栏输入:http://localhost:9200/blogerbus/_search?q=user:lilei&pretty=true,点击 Send 按钮,返回值:

es client 插入数据_elasticsearch_17

上面是直接在 url 上用字符串查询,还可以用 json 格式来查询:



Copy

{ "query" : { "match" : { "user": "lilei" } } } 
url 修改为 http://localhost:9200/blogerbus/_search?pretty=true,

es client 插入数据_elasticsearch_18

返回的数据与上面相同。

  • curl 搜索


Copy

curl -XGET 'http://localhost:9200/blogerbus/_search?pretty=true' -H 'Content-Type: application/json' -d '{\"query\": {\"match\":{\"user\": \"lilei\"}}}' 

返回的内容与 Postman 搜索返回内容相同

删除#

删除文档基本语法:



Copy

DELETE /{索引名称}/_doc/文档id 

例如,curl 删除一篇 id 为 2 的文档:



Copy

curl -XDELETE 'http://localhost:9200/bookmall/_doc/2' 

返回:



Copy

{"_index":"bookmall","_type":"_doc","_id":"2","_version":3,"result":"deleted","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":3,"_primary_term":1} 

后面没有加?pretty=true,所以返回数据排版是不易读的json。

删除索引基本语法:



Copy

DELETE /{索引名称}

修改#

修改有2种方式:全量修改和增量修改

  • 全量修改:直接覆盖原来的文档。根据指定 id 删除,id 不存在时,修改变成新增。

基本语法:



Copy

PUT /{索引名称}/_doc/文档id { "字段1": "值1", "字段2": "值2", // ... 略 }

  • 增量修改:修改文档中部分字段,只修改指定 id 中匹配文档的部分字段。

基本语法:



Copy

POST /{索引名称}/_update/文档id { "doc": { "字段名": "新值", } }

curl 全量修改:

把上面的 bookmall/_doc/1 中 2 个字段值都修改下:



Copy

curl -XPUT "http://localhost:9200/bookmall/_doc/1?pretty" -H "Content-Type: application/json" -d '{\"product_id\": 1234567, \"quantity\": 1000}' 

修改成功后返回数据:



Copy

{ "_index" : "bookmall", "_type" : "_doc", "_id" : "1", "_version" : 2, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 4, "_primary_term" : 1 } 

那能不能修改值的同时新增一个字段?可以的。例如,给文档 id 为 1 的新增一个字段 num:50 ,修改 quantity 为 2000,如下:



Copy

curl -XPUT "http://localhost:9200/bookmall/_doc/1?pretty" -H "Content-Type: application/json" -d '{\"product_id\": 123456, \"quantity\": 2000,\"name\":\"shiije\",\"num\":50}' 

可以修改成功。

curl 部分修改:

修改文档 id 为 1 中的字段 product_id 为 123,



Copy

curl -XPOST "http://localhost:9200/bookmall/_update/1?pretty" -H "Content-Type: application/json" -d '{\"doc\":{\"product_id\": 123}}' 

可以修改成功。