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的请求命令,除了索引,还支持很多数据

image-20240220144503510

查看单个索引

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命令获取所有文档数据

各参数详解:

  1. took: 这个字段表示查询花费的时间,单位是毫秒。在这个例子中,查询花费了73毫秒。

  2. timed_out: 这是一个布尔值,表示查询是否超时。如果为true,表示查询执行时间超过了设定的超时时间。在这个例子中,查询没有超时,所以值为false

  3. _shards: 这个字段提供了关于查询涉及的分片的信息。

    • total: 表示参与查询的分片总数。在这个例子中,只有1个分片参与查询。
    • successful: 表示成功参与查询的分片数。在这个例子中,1个分片成功参与了查询。
    • skipped: 表示跳过的分片数。在这个例子中,没有分片被跳过。
    • failed: 表示查询失败的分片数。在这个例子中,没有分片查询失败。
  4. 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: 文档的实际内容。在这个例子中,文档包含titlecategoryimagesprice等字段。

根据文档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)主要涉及以下参数:

  1. properties:这是定义索引中文档字段的关键部分。每个字段都有其类型和相关属性。例如,一个字段可能是文本类型(用于全文搜索),关键字类型(用于排序和聚合),数字类型等。
    • type:定义字段的数据类型,如"text", "keyword", "integer", "float", "boolean"等。
    • analyzer:指定用于分析文本字段的分析器。分析器决定了如何将文本转换为词项,以便进行搜索和索引。
    • null_value:如果文档中没有为字段提供值,则使用此默认值。
    • fields:对于多字段类型(如"text"),可以定义子字段以进行不同的分析或索引。
    • ignore_above:对于文本字段,此参数定义了忽略字符串长度的阈值。超过此长度的字符串将不会被索引。
    • index:控制字段是否应该被索引(true)或忽略(false)。
    • store:控制字段值是否应该与_source字段一起存储。
    • doc_values:控制字段是否应该存储doc_values,这对于排序、聚合和脚本非常有用。
  2. dynamic:此参数控制当索引文档中包含未在映射中明确定义的字段时,Elasticsearch应如何处理这些字段。可能的值包括"true"(自动添加新字段到映射),"false"(忽略新字段),或者一个字符串,指定新字段应该添加到哪个现有字段中。
  3. _source:此参数控制是否存储原始JSON文档。默认情况下,它是启用的,但可以通过将其设置为"false"来禁用。
  4. _all:此参数控制是否创建一个特殊的字段,该字段包含文档中所有字段的值。这可以用于简单的全文搜索,但通常建议显式定义用于搜索的字段。
  5. _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}}}'
posted @ 2024-02-22 16:17  MrSponge  Views(160)  Comments(0Edit  收藏  举报