3、ES基础http命令
创建索引
curl -X PUT http://localhost:9200/shopping
创建索引使用-X
参数指定PUT
请求,ES7.x后默认创建索引是1个分片
数
PUT
请求是幂等性的,如果重复创建,会报错
Linux中用curl
命令操作ES需指定用户名密码(本文省略),具体样例如下:
curl -u name:passwod -X PUT http://localhost:9200/shopping
查看所有索引
curl -X GET http://localhost:9200/_cat/indices?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
yellow open shopping WNJE1-_vT4y66DCXxBW12g 1 1 0 0 208b 208b
查看数据使用GET
请求
v
参数表示打印表头
表头 | 含义 |
---|---|
health | 当前服务器健康状态: green(集群完整) yellow(单点正常、集群不完整[可能副本有问题]) red(单点不正常) |
status | 索引打开、关闭状态 |
index | 索引名 |
uuid | 索引统一编号 |
pri | 主分片数量 |
rep | 副本数量 |
docs.count | 可用文档数量 |
docs.deleted | 文档删除状态(逻辑删除) |
store.size | 主分片和副分片整体占空间大小 |
pri.store.size | 主分片占空间大小 |
_cat
是ES的请求命令,除了索引,还支持很多数据
查看单个索引
curl -X GET http://localhost:9200/shopping
}
"shopping"【索引名】: {
"aliases"【别名】: {},
"mappings"【映射】: {},
"settings"【设置】: {
"index"【设置-索引】: {
"creation_date"【设置-索引-创建时间】: "1708394897083",
"number_of_shards"【设置-索引-分片数】: "1",
"number_of_replicas"【设置-索引-创副本数】: "1",
"uuid"【设置-索引-唯一标识】: "WNJE1-_vT4y66DCXxBW12g",
"version"【设置-索引-版本】: {
"created": "7080099"
},
"provided_name"【设置-索引-名称】: "shopping"
}
}
}
}
shopping为想要查询的索引名
删除索引
curl -X DELETE http://localhost:9200/shopping
删除选择DELETE
请求,域名地址后面接索引名
给索引添加文档数据
curl -H 'Content-Type: application/json' -X POST http://localhost:9200/shopping/_doc/1001 -d '{"title":"小米手机","category":"小米","images":"http://www.gulixueyuan.com/xm.jpg","price":3999.00}'
- 请求方式为
POST
,必须包含请求体body
,请求体格式为json
由-H
参数指定 -H
设置后面参数的请求参数格式-doc
命令表示添加文档数据,可以换成_create
- _doc后面的1001表示该文档的
id
,如果不手动指定,系统会默认自动随机添加,相当于mysql中的主键,一条数据对应一个id -d
后接请求体,请求体数据用''
单引号括起来
注意:这里的
POST
不是幂等性的,如果重复操作,会给文档生成不同id
返回内容:
{
"_index": "shopping",
"_type": "_doc",
"_id": "Ix17xY0Bgwanwtb8d8RY",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
这里创建时没有指定id,若指定因为1001
查看索引下的所有文档数据
curl -X GET http://localhost:9200/shopping/_search
返回内容:
{
"took": 73,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "Ix17xY0Bgwanwtb8d8RY",
"_score": 1.0,
"_source": {
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999.00
}
}
]
}
}
使用_search
命令获取所有文档数据
各参数详解:
-
took: 这个字段表示查询花费的时间,单位是毫秒。在这个例子中,查询花费了73毫秒。
-
timed_out: 这是一个布尔值,表示查询是否超时。如果为
true
,表示查询执行时间超过了设定的超时时间。在这个例子中,查询没有超时,所以值为false
。 -
_shards: 这个字段提供了关于查询涉及的分片的信息。
- total: 表示参与查询的分片总数。在这个例子中,只有1个分片参与查询。
- successful: 表示成功参与查询的分片数。在这个例子中,1个分片成功参与了查询。
- skipped: 表示跳过的分片数。在这个例子中,没有分片被跳过。
- failed: 表示查询失败的分片数。在这个例子中,没有分片查询失败。
-
hits: 这是查询结果的主要部分,包含了查询返回的文档信息。
-
- total
- 提供了查询结果的总数信息。
- value: 表示查询返回的总文档数。在这个例子中,查询返回了1个文档。
- relation: 表示
value
字段与查询请求中的size
参数之间的关系。eq
表示两者相等,gte
表示计数不准确,即查询返回的文档数等于请求中指定的size
。
-
max_score: 表示查询结果中得分最高的文档的得分。在这个例子中,最高得分为1.0。
-
- hits
- 这是一个数组,包含了查询返回的文档信息。在这个例子中,只返回了一个文档。
- _index: 文档所在的索引名。在这个例子中,文档位于
shopping
索引。 - _type: 文档的类型(在Elasticsearch 7.x及之后的版本中,这个字段已经不再使用,但仍可能出现在旧版本的响应中)。在这个例子中,文档的类型是
_doc
。 - _id: 文档的唯一ID。在这个例子中,文档的ID是
Ix17xY0Bgwanwtb8d8RY
。 - _score: 文档与查询的匹配得分。得分越高,表示文档与查询的匹配度越高。在这个例子中,文档的得分为1.0。
- _source: 文档的实际内容。在这个例子中,文档包含
title
、category
、images
和price
等字段。
-
根据文档id获取文档数据
curl -X GET http://localhost:9200/shopping/_doc/Ix17xY0Bgwanwtb8d8RY
返回内容:
{
"_index": "shopping",
"_type": "_doc",
"_id": "Ix17xY0Bgwanwtb8d8RY",
"_version": 1,
"_seq_no": 0,
"_primary_term": 1,
"found": true,
"_source"【文档源信息】: {
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 3999.00
}
}
覆盖文档数据
curl -H 'Content-Type: application/json' -X POST http://localhost:9200/shopping/_doc/Ix17xY0Bgwanwtb8d8RY -d '{"title":"华为手机","category":"华为","images":"http://www.gulixueyuan.com/hw.jpg","price":4999.00}'
返回结果:
{
"_index": "shopping",
"_type": "_doc",
"_id": "Ix17xY0Bgwanwtb8d8RY",
"_version": 4,
"result": "updated",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 3,
"_primary_term": 1
}
这里跟新增文档数据一样,都是用的POST
请求,通过文档id指定修改数据。一个id对应一条记录,如果存在相同id会直接覆盖。
修改文档字段
curl -H 'Content-Type: application/json' -X POST http://localhost:9200/shopping/_update/Ix17xY0Bgwanwtb8d8RY -d '{ "doc": {"price":3000.00} }'
与添加文档数据一样,用的都是POST
请求,但索引后接的不在是_doc
而是_update
。
关于修改文档、修改字段的异同点:覆盖(修改)文档与修改字段都是用的
POST
请求,都需要指定对应文档的id;修改文档用_doc
,它可以直接改变原本文档的所有结构;修改字段用_update
,它只能改变原本文档的已有的信息数据。
删除文档数据
curl -X DELETE http://localhost:9200/shopping/_doc/Ix17xY0Bgwanwtb8d8RY
如果指定的文档不存在就会报找不到
按条件删除文档数据
先查看该索引下有的文本数据样貌
curl -X GET http://localhost:9200/shopping/_search
{
"took": 1142,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "1002",
"_score": 1.0,
"_source": {
"title": "小米手机",
"category": "小米",
"images": "http://www.gulixueyuan.com/xm.jpg",
"price": 4000.00
}
},
{
"_index": "shopping",
"_type": "_doc",
"_id": "1003",
"_score": 1.0,
"_source": {
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 4000.00
}
},
{
"_index": "shopping",
"_type": "_doc",
"_id": "1004",
"_score": 1.0,
"_source": {
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 4999.00
}
}
]
}
}
按条件删除
curl -H 'Content-Type: application/json' -X POST http://localhost:9200/shopping/_delete_by_query -d '{"query":{"match":{"price":4000.00}}}'
{
"took": 205,
"timed_out": false,
"total": 2,
"deleted": 2,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures": []
}
这里用的是POST
请求,具体查询语句后面再讲解
再次查看索引的文档数据
curl -X GET http://localhost:9200/shopping/_search
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "shopping",
"_type": "_doc",
"_id": "1004",
"_score": 1.0,
"_source": {
"title": "华为手机",
"category": "华为",
"images": "http://www.gulixueyuan.com/hw.jpg",
"price": 4999.00
}
}
]
}
}
具体的条件使用后面再说
创建映射
curl -H 'Content-Type: application/json' -X PUT http://127.0.0.1:9200/student/_mapping -d '{"properties": {"name":{"type": "text","index": true},"sex":{"type": "keyword","index": ture},"age":{"type": "long","index": false}}}'
创建索引使用的是PUT
请求,同时要确保该索引已存在
在Elasticsearch中,创建映射(Mapping)主要涉及以下参数:
- properties:这是定义索引中文档字段的关键部分。每个字段都有其类型和相关属性。例如,一个字段可能是文本类型(用于全文搜索),关键字类型(用于排序和聚合),数字类型等。
- type:定义字段的数据类型,如"text", "keyword", "integer", "float", "boolean"等。
- analyzer:指定用于分析文本字段的分析器。分析器决定了如何将文本转换为词项,以便进行搜索和索引。
- null_value:如果文档中没有为字段提供值,则使用此默认值。
- fields:对于多字段类型(如"text"),可以定义子字段以进行不同的分析或索引。
- ignore_above:对于文本字段,此参数定义了忽略字符串长度的阈值。超过此长度的字符串将不会被索引。
- index:控制字段是否应该被索引(true)或忽略(false)。
- store:控制字段值是否应该与_source字段一起存储。
- doc_values:控制字段是否应该存储doc_values,这对于排序、聚合和脚本非常有用。
- dynamic:此参数控制当索引文档中包含未在映射中明确定义的字段时,Elasticsearch应如何处理这些字段。可能的值包括"true"(自动添加新字段到映射),"false"(忽略新字段),或者一个字符串,指定新字段应该添加到哪个现有字段中。
- _source:此参数控制是否存储原始JSON文档。默认情况下,它是启用的,但可以通过将其设置为"false"来禁用。
- _all:此参数控制是否创建一个特殊的字段,该字段包含文档中所有字段的值。这可以用于简单的全文搜索,但通常建议显式定义用于搜索的字段。
- _routing:此参数控制文档的路由方式。路由决定了文档应该存储在哪个分片上。通过为文档指定一个路由值,可以确保具有相同路由值的文档始终存储在同一分片上。
在创建映射时,最重要的是定义properties,因为它定义了如何存储和索引文档中的数据。其他参数则提供了更高级的控制,以优化索引的性能和效率。
参数里的字段类型有一个
keyword
类型,该类型表示不参与分词,即Elasticsearch不会进行分词处理,而是将整个字符串作为一个整体进行索引,下面已一个例子做参考
向刚刚的索引中添加如下数据:
{
"name":"张三",
"sex":"男的",
"age":20
}
查询数据(在上面的映射中,我们设置了name可分词和索引,sex不可分词可索引,age可分词不可索引)
curl -H 'Content-Type: application/json' -X GET http://localhost:9200/student/_search -d '{"query": { "match": {"name":"张"} }}'
{
"took": 639,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "student",
"_type": "_doc",
"_id": "1001",
"_score": 0.2876821,
"_source": {
"name": "张三",
"sex": "男的",
"age": 20
}
}
]
}
}
curl -H 'Content-Type: application/json' -X GET http://localhost:9200/student/_search -d '{"query": { "match": {"sex":"男"} }}'
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 0,
"relation": "eq"
},
"max_score": null,
"hits": []
}
}
curl -H 'Content-Type: application/json' -X GET http://localhost:9200/student/_search -d '{"query": { "match": {"sex":"男的"} }}'
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.2876821,
"hits": [
{
"_index": "student",
"_type": "_doc",
"_id": "1001",
"_score": 0.2876821,
"_source": {
"name": "张三",
"sex": "男的",
"age": 20
}
}
]
}
}
curl -H 'Content-Type: application/json' -X GET http://localhost:9200/student/_search -d '{"query": { "match": {"age":20} }}'
{
"error": {
"root_cause": [
{
"type": "query_shard_exception",
"reason": "failed to create query: Cannot search on field [age] since it is not indexed.",
"index_uuid": "KQNm5k-fR36fgKFoH9IC4g",
"index": "student"
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "student",
"node": "QrFueMfXScmd-CRYJ9HHEQ",
"reason": {
"type": "query_shard_exception",
"reason": "failed to create query: Cannot search on field [age] since it is not indexed.",
"index_uuid": "KQNm5k-fR36fgKFoH9IC4g",
"index": "student",
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Cannot search on field [age] since it is not indexed."
}
}
}
]
},
"status": 400
}
默认字段是可以索引的,如果设置了不能索引,将会报错
查看映射
curl -X GET http://localhost:9200/student/_mapping
{
"student": {
"mappings": {
"properties": {
"age": {
"type": "long",
"index": false
},
"name": {
"type": "text"
},
"sex": {
"type": "keyword"
},
"tele": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
建索引时创建映射
curl -H 'Content-Type: application/json' -X PUT http://127.0.0.1:9200/student1 -d '{"properties": {"name":{"type": "text","index": true},"sex":{"type": "keyword","index": ture},"age":{"type": "long","index": false}}}'