Elasticsearch 的 REST APIs
摘要
-
本文介绍 Elasticsearch 的 REST APIs
-
Elasticsearch版本8.17.3
- Elasticsearch 的 REST APIs:聚合查询
返回内容格式化
-
返回json信息格式:
?pretty
输出格式化后的json,比如:curl http://localhost:9200/_cluster/health?pretty
-
返回行信息格式:
?v
输出内容上方会加上标题行,比如:curl http://localhost:9200/_cat/health?v
CAT APIs
-
Elasticsearch 提供了 CAT APIs,它们提供了一种简单的方式来查看集群状态和集群中的各种资源,比如索引、分片、节点等。
1 | GET /_cat/health #查看集群当前状态:红、黄、绿 |
Cluster APIs
-
Elasticsearch 提供了一系列的 Cluster APIs,它们提供了管理和监控集群状态的功能
1 | GET /_cluster/health # 获取集群的健康状态信息,包括了集群总体的状况如status、number_of_nodes等。 |
Index APIs
-
Elasticsearch 提供了 Index APIs,它们提供了对索引的创建、更新、查询和删除等操作。
-
创建索引
1 | # PUT /<target> |
-
创建索引并设置索引
1 | # PUT /<target> |
-
创建并映射索引
1 | # PUT /<target> |
-
更新索引映射
1 | # PUT /<target>/_mapping |
-
更新索引设置
1 | # PUT /<target>/_settings |
-
查看指定索引
1 | # GET /<target> |
-
查看索引设置
1 | # GET /<target>/_settings |
-
查看字段映射
1 | # GET /<target>/_mapping/field/<field> |
-
判断索引是否存在
1 | # 使用 -I 参数来发送 HEAD 请求,可以获取响应头而不必下载响应体。 |
-
删除索引
1 | # DELETE /<target> |
-
为索引创建别名
1 | # 注意:不同索引可以有相同名称的别名,所以在数据结构一致的情况下,我们可以为不同的索引创建相同的别名,然后根据别名进行数据查询 |
-
查看索引别名
1 | # GET /<target>/_alias/<alias> |
-
为索引删除别名
1 | # DELETE /<target>/_alias/<alias> |
如何修改索引字段类型或分词器类型?
-
创建新的索引
1 | # 这里为title字段增加分词器 |
-
将原索引的数据迁移到新索引
1 | curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/_reindex' \ |
-
删除原索引
1 | curl -X DELETE -u elastic:123456 -k 'https://127.0.0.1:9200/shopping' |
-
为新索引创建别名
1 | curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/shopping_new/_alias/shopping' |
数据增删改基本操作
-
新增数据
- 1.为指定索引插入一条数据(_doc方式:不指定id默认随机字符串)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28# _doc 的方式创建索引数据时,可以不指定id,默认会创建新的id,id类型为随机字符串
# POST /<target>/_doc
curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_doc?pretty' \
-H 'Content-Type: application/json' \
-d '{
"category": "electronics",
"price": 999.99,
"count": 10,
"title": "Smartphone X - 128GB",
"remark": "This latest Smartphone X comes with a powerful processor and high-resolution camera.",
"address": "123 Electronic Ave, Beijing, China",
"tags": ["latest", "smartphone", "technology"],
"created_at": "2025-04-22 03:30:02"
}'
# 返回值
{
"_index" : "shopping_new",
"_id" : "sImNW5YBmgASmV9McVvI",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 3,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}- 2.为指定索引插入一条数据(_doc方式:指定id)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28# _doc 的方式创建索引数据时,如果指定id,再次执行时会先删除原数据再创建新数据,所以必须全量更新才行。
# PUT /<target>/_doc
curl -X PUT -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_doc/100?pretty' \
-H 'Content-Type: application/json' \
-d '{
"category": "electronics",
"price": 999.99,
"count": 10,
"title": "Smartphone X - 128GB",
"remark": "This latest Smartphone X comes with a powerful processor and high-resolution camera.",
"address": "123 Electronic Ave, Beijing, China",
"tags": ["latest", "smartphone", "technology"],
"created_at": "2025-04-22 03:30:02"
}'
# 返回值
{
"_index" : "shopping_new",
"_id" : "100",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 3,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 2,
"_primary_term" : 1
}-
3.为指定索引插入一条数据(_create方式:指定id)
1
2
3
4
5
6
7
8
9
10
11
12
13
14# _create 的方式创建索引数据时,必须指定id,而且只能执行一次,因为执行过一次后指定id的数据就存在了,不能再次创建
# POST /<target>/_create/<id>
curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_create/1?pretty' \
-H 'Content-Type: application/json' \
-d '{
"category": "electronics",
"price": 999.99,
"count": 10,
"title": "Smartphone X - 128GB",
"remark": "This latest Smartphone X comes with a powerful processor and high-resolution camera.",
"address": "123 Electronic Ave, Beijing, China",
"tags": ["latest", "smartphone", "technology"],
"created_at": "2025-04-22 03:30:02"
}' -
修改数据
- 1.修改全部数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14# POST /<target>/_doc/<id>
# 执行时会先删除原数据再创建新数据,所以必须全量更新才行。
curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_doc/sImNW5YBmgASmV9McVvI' \
-H 'Content-Type: application/json' \
-d '{
"category": "electronics",
"price": 999.99,
"count": 20,
"title": "Smartphone X - 128GB",
"remark": "This latest Smartphone X comes with a powerful processor and high-resolution camera.",
"address": "123 Electronic Ave, Beijing, China",
"tags": ["latest", "smartphone", "technology"],
"created_at": "2025-04-22 03:30:02"
}'- 2.修改部分数据
1
2
3
4
5# POST /<target>/_update/<id>
# 执行时只会修改指定字段,不会删除原数据,所以可以部分更新。
curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_update/1' \
-H 'Content-Type: application/json' \
-d '{"doc":{"count":100}}' -
查询指定索引的指定id的数据
1 | # GET /<target>/_doc/<id> |
-
删除指定索引的指定id的数据
1 | # DELETE /<target>/_doc/<id> |
-
删除索引全部数据
1 | curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_delete_by_query?pretty' \ |
批量操作
-
批量新增数据
1 | # 注意数据行要顶行写,前面不要有空格 |
-
批量修改数据
1 | # 注意数据行要顶行写,前面不要有空格 |
-
批量删除数据
1 | # 注意数据行要顶行写,前面不要有空格 |
条件更新
1 | # POST /<target>/_update_by_query |
条件删除
1 | # POST /<target>/_delete_by_query |
条件查询
match_all: 全部匹配查询
1 | # GET /<target>/_search |
term: 精确匹配查询(关键字查询,即不分词)
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
terms: 多关键字精确匹配查询
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
range: 范围查询
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
exists: 查询字段存在的数据
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
ids: 根据一组ID查询
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
prefix: 前缀查询
-
仅适用于关键字类型(keyword)的字段
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
wildcard: 通配符查询
-
仅适用于关键字类型(keyword)的字段
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
regexp: 正则表达式查询
-
仅适用于关键字类型(keyword)的字段
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
fuzzy: 支持编辑距离的模糊查询
-
仅适用于关键字类型(keyword)的字段
-
fuzzy检索是一种强大的搜索功能,它能够在用户输入内容存在拼写错误或上下文不一致时,仍然返回与搜索词相似的文档。通过使用编辑距离算法来度量输入词与文档中词条的相似程度,模糊查询在保证搜索结果相关性的同时,有效地提高了搜索容错能力。
-
编辑距离是指从一个单词转换到另一个单词需要编辑单字符的次数。如中文集团到中威集团编辑距离就是1,只需要修改一个字符;如果fuzziness值在这里设置成2,会把编辑距离为2的东东集团也查出来。
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
match: 全文检索(即分词)
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
multi_match: 多字段查询
-
multi_match查询在Elasticsearch中用于在多个字段上执行相同的搜索操作。它可以接受一个查询字符串,并在指定的字段集合中搜索这个字符串。multi_match查询提供了灵活的匹配类型和操作符选项,以便根据不同的搜索需求调整搜索行为。
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
match_phrase: 短语查询
-
match_phrase查询在Elasticsearch中用于执行短语搜索,它不仅匹配整个短语,而且还考虑了短语中各个词的顺序和位置。这种查询类型对于搜索精确短语非常有用,尤其是在用户输入的查询与文档中的文本表达方式需要严格匹配时。
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
query_string: 支持与或非
表达式的查询
-
query_string查询是一种灵活的查询类型,它允许使用Lucene查询语法来构建复杂的搜索查询。这种查询类型支持多种逻辑运算符,包括与(AND)、或(OR)和非(NOT),以及通配符、模糊搜索和正则表达式等功能。query_string查询可以在单个或多个字段上进行搜索,并且可以处理复杂的查询逻辑。
-
注意: 查询字段分词就将查询条件分词查询,查询字段不分词将查询条件不分词查询
1 | # 查询所有字段中包含 "公园"和 "华为" 的文档 |
simple_query_string: 类似 query_string
,但是会忽略错误的语法,同时只支持部分查询语法
1 | curl -X GET -u elastic:123456 -k 'https://127.0.0.1:9200/shopping/_search?pretty' \ |
ES查询结果属性含义
1 | { |
bool 查询
-
布尔查询可以按照布尔逻辑条件组织多条查询语句,只有符合整个布尔条件的文档才会被搜索出来。
-
在布尔条件中,可以包含两种不同的上下文。
- 1.搜索上下文(query context):使用搜索上下文时,Elasticsearch需要计算每个文档与搜索条件的相关度得分,这个得分的计算需使用一套复杂的计算公式,有一定的性能开销,带文本分析的全文检索的查询语句很适合放在搜索上下文中。
- 2.过滤上下文(filter context):使用过滤上下文时,Elasticsearch只需要判断搜索条件跟文档数据是否匹配,例如使用
Term query
判断一个值是否跟搜索内容一致,使用Range query
判断某数据是否位于某个区间等。过滤上下文的查询不需要进行相关度得分计算,还可以使用缓存加快响应速度,很多术语级查询语句都适合放在过滤上下文中。
-
bool 查询包含 must、must_not、should、filter 四种子句。
类型 | 说明 |
---|---|
must | 可包含多个查询条件,每个条件均满足的文档才能被搜索到,每次查询需要计算相关度得分,属于搜索上下文 |
should | 可包含多个查询条件,不存在must和fiter条件时,至少要满足多个查询条件中的一个,文档才能被搜索到,否则需满足的条件数量不受限制,匹配到的查询越多相关度越高,也属于搜索上下文 |
filter | 可包含多个过滤条件,每个条件均满足的文档才能被搜索到,每个过滤条件不计算相关度得分,结果在一定条件下会被缓存, 属于过滤上下文 |
must_not | 可包含多个过滤条件,每个条件均不满足的文档才能被搜索到,每个过滤条件不计算相关度得分,结果在一定条件下会被缓存, 属于过滤上下文 |
must
1 | # 两个条件都需要满足 |
must_not
1 | # 两个条件都不满足 |
should
1 | # 两个条件满足一个即可 |
filter
1 | # filter中的条件为非 match,即不能是全文检索 |
分页与排序
1 | # from: 从第几条开始,默认0 |
只返回部分字段
1 | # _source: 指定要返回的字段列表 |
高亮显示
1 | # 高亮显示仅支持全文检索字段 |
地理空间位置查询
-
地理空间位置查询是数据库和搜索系统中的一个重要特性,特别是在地理信息系统(GIS)和位置服务中。它允许用户基于地理位置信息来搜索和过滤数据。在Elasticsearch这样的全文搜索引擎中,地理空间位置查询被广泛应用,例如在旅行、房地产、物流和零售等行业,用于提供基于位置的搜索功能。
-
在Elasticsearch中,地理空间数据通常存储在
geo_point
字段类型中。这种字段类型可以存储纬度和经度坐标,用于表示地球上的一个点。
示例
-
创建一个索引,并添加一个
geo_point
字段:
1 | curl -X PUT -u elastic:123456 -k 'https://127.0.0.1:9200/tourist_spots' \ |
-
插入数据
1 | curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/tourist_spots/_bulk' \ |
-
查询数据
1 | # 查询杭州西湖5km附近的景点 |
向量搜索
-
Elasticsearch 8.x 引入了一个重要的新特性:向量检索(Vector Search),特别是通过KNN(K-Nearest Neighbors)算法支持向量近邻检索。这一特性使得Elasticsearch在机器学习、数据分析和推荐系统等领域的应用变得更加广泛和强大。
-
向量检索的基本思路是,将文档(或数据项)表示为高维向量,并使用这些向量来执行相似性搜索。在Elasticsearch中,这些向量被存储在
dense_vector
类型的字段中,然后使用KNN算法来找到与给定向量最相似的其他向量。
示例
-
创建索引
1 | curl -X PUT -u elastic:123456 -k 'https://127.0.0.1:9200/image-index' \ |
-
添加数据
1 | curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/image-index/_bulk' \ |
-
向量检索
1 | curl -X POST -u elastic:123456 -k 'https://127.0.0.1:9200/image-index/_search?pretty' \ |