【精选】【ElasticSearch】之常用 HTTP 请求命令

您所在的位置:网站首页 查看索引的语法 【精选】【ElasticSearch】之常用 HTTP 请求命令

【精选】【ElasticSearch】之常用 HTTP 请求命令

2023-10-28 03:58| 来源: 网络整理| 查看: 265

目录 1、通过 RESTful 访问 ElasticSearch2、添加索引3、访问索引4、访问所有索引信息5、删除索引6、给索引添加文档数据7、给索引添加文档数据并指定 ID8、根据ID获取文档数据9、获取指定索引下的所有文档数据10、全量修改文档数据11、修改文档的局部数据12、删除文档数据13、条件查询14、分页查询15、指定返回字段16、查询结果排序17、多条件查询和范围查询18、全文检索19、完全匹配20、高亮显示结果21、聚合查询22、映射关系 1、通过 RESTful 访问 ElasticSearch curl -X GET http://localhost:9200 ElasticSearch 的 RESTful 端口为 9200 2、添加索引 curl -X PUT http://localhost:9200/demo 添加索引使用的是 PUT 请求,域名地址后面的 demo 就是要添加的索引名称;PUT 请求操作结果是幂等性的,意思是多次相同的请求结果是一样的,所以,再次执行该请求时会报错提示索引已存在了。 3、访问索引 curl -X GET http://localhost:9200/demo 访问索引使用的是 GET 请求,域名地址后面的 demo 就是所要访问的索引名称。 4、访问所有索引信息 curl -X GET http://localhost:9200/_cat/indices?v 域名地址后面紧跟的 _cat 是 ES 的请求命令,表示查看文档;-v 参数表示把所有信息详细地展示出来。 5、删除索引 curl -X DELETE http://localhost:9200/demo 删除索引使用 DELETE 请求,域名地址后面紧跟要删除的索引名称。 6、给索引添加文档数据 curl -X POST http://localhost:9200/demo/_doc -d "{\"name\": \"hello\"}" -H "content-type: application/json; charset=UTF-8" _doc 命令表示添加文档数据,可以换成 _create;请求方式为 POST,必须包含请求体 body,请求体格式为 JSON 格式;POST 请求不是幂等性的操作,多次相同的请求互不影响(ES 会生成不同的 _id)。

返回内容如下:

{ "_index": "demo", "_type": "_doc", "_id": "KL8xSnsBZDsVkmfG6wXh", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 1, "_primary_term": 1 } 返回的 _id 为 ES 随机生成的 ID。 7、给索引添加文档数据并指定 ID curl -X POST http://localhost:9200/demo/_doc/1001 -d "{\"name\": \"hello\"}" -H "content-type: application/json; charset=UTF-8" 指定 ID 的方式为:在请求末尾添加 ID 值;

返回内容如下:

{ "_index": "demo", "_type": "_doc", "_id": "1001", "_version": 1, "result":"created", "_shards": { "total": 2, "successful": 1, "failed":0 }, "_seq_no": 2, "_primary_term": 1 } 从返回结果可以看到,文档数据中的 _id 使用了我们提供的 ID 值;如果指定了 ID 值,则不允许多次创建该 ID 值的文档数据。 8、根据ID获取文档数据 curl -X GET http://localhost:9200/demo/_doc/1001 9、获取指定索引下的所有文档数据 curl -X GET http://localhost:9200/demo/_search 域名地址后面紧跟的就是所要获取的索引名;使用 _search 命令获取所有文档数据。 10、全量修改文档数据 curl -X PUT http://localhost:9200/demo/_doc/1001 -d "{\"name\": \"java\"}" -H "content-type: application/json; charset=UTF-8" 该请求表示:使用 PUT 请求发送 _doc 命令修改 ID 值为 1001 的文档数据;请求会直接覆盖 ID 值为 1001 的文档数据的全部内容。

返回结果会提示我们该请求为更新 update 操作:

{ "_index": "demo", "_type": "_doc", "_id": "1001", "_version": 3, "result": "updated", } 11、修改文档的局部数据 curl -X POST http://localhost:9200/demo/_update/1001 -d "{\"doc\": {\"name\": \"Ruby\"}}" -H "content-type: application/json; charset=UTF-8" 由于每次修改局部数据的操作结果都是不同的,所以它不是幂等性的,既然不是幂等性的话,我们就选择使用 POST 请求,而不是 PUT 请求;由于使用的是 POST 请求,所以需要使用 _update 命令,而不能使用 _doc 命令,因为 _doc 命令会被认为是创建文档数据;局部数据的 JSON 格式固定为:{"doc": {key: value}},在 doc 中指定要修改的字段即可。 12、删除文档数据 curl -X DELETE http://localhost:9200/demo/_doc/1001 删除请求使用的是 _doc 命令、DELETE 请求。 13、条件查询

1、使用请求路径参数:

curl -X GET http://localhost:9200/demo/_search?q=name:wang 请求表示查询所有 name 字段值为 "wang" 的文档数据,搜索结果会列出所有匹配的数据;使用请求路径参数的方式会比较麻烦,并且如果路径中包含中文的话容易出出现乱码现象。

2、使用请求体:

curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体中我们使用如下数据:

{ "query": { "match": { "name": "wang" } } } "query" 表示查询,"match" 表示匹配,里面填写要匹配的字段值;这里的请求数据表示:查询 name 为 wang 的所有文档数据。

如果要查询所有数据,请求体可以改成如下:

{ "query": { "match_all": { } } } 14、分页查询 curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据如下:

{ "query": { "match_all": { } }, "from": 0, "size": 1 } "from" 参数表示从第几条数据开始;"size" 参数表示获取多少条数据。

返回的数据如下(截取部分):

{ "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1.0, "hits": [ { "_index": "demo", "_type": "_doc", "_id": "1001", "_score": 1.0, "_source": { "name": "wang", "sex": "man", "phone": "123456" } } ] } } "total" 中的值表示本地查询条件的结果总数情况:总共3条,查询关系为等值查询;最里面的 "hits" 表示返回的具体值列表,而其中的 "_source" 列出每个文档数据中的所有字段值。 15、指定返回字段 curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数:

{ "query": { "match_all": { } }, "from": 0, "size": 1, "_source": ["name"] } 指定返回字段的参数为 _source,值为要返回的字段列表。

这里,我们只指定了返回 name 字段,结果如下:

{ "hits": { "total": { "value": 3, "relation": "eq" }, "max_score": 1.0, "hits": [ { "_index": "demo", "_type": "_doc", "_id": "1001", "_score": 1.0, "_source": { // 结果只返回了name字段 "name": "wang" } }, ] } } 16、查询结果排序 curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数如下:

{ "query": { "match_all": { } }, "sort": { "phone": { "order": "desc" } } } 排序使用的是 "_sort" 参数,里面填写要按哪个字段排序,排序字段中填写排序的顺序:desc 表降序,asc 表示升序;这里参数的意思是:按照 phone 字段排序,排序规则为 desc 降序。 17、多条件查询和范围查询

1、多条件查询

curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数如下:

{ "query": { "bool": { "must": [ { "match": { "name": "wang" } }, { "match": { "age": 10 } } ] } } } query 参数表示查询,bool 参数表示查询的条件,里面填写要查询的条件;must 参数表示多个条件要同时成立,里面填写条件列表,相当于 AND 的意思;整个请求参数表示:匹配 name 为 wang 并且 age 为 10 的文档数据。

如果要表示或的话,需要将 msut 改成 should:

{ "query": { "bool": { "should": [ { "match": { "name": "wang" } }, { "match": { "name": "andy" } } ] } } } 这里的 should 参数表示条件列表中任意一个匹配即可,相当于 OR 的意思;这里的请求参数表示:匹配 name 为 wang 或者 name 为 andy 的文档数据。

2、范围查询

范围查询的请求参数如下:

{ "query": { "bool": { "must": [ { "match": { "name": "wang" } } ], "filter": { "range": { "age": { "gt": 10 } } } } } } 范围查询只需要在 bool 条件下添加 filter 参数,改参数里面可以填写多个过滤条件;filter 参数下的 range 条件调试范围,里面填写要范围查询的字段;这里的请求参数表示:匹配所有 name 为 wang 的文档数据,同时对这些数据进行过滤,过滤条件为 age 字段值必须大于 10,gt 表示大于,常见的还有 lt(小于)、eq(等于)、ne(不等于)等等。 18、全文检索

ES 的全文检索:

curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据:

{ "query": { "match": { "name": "你好" } } }

得到的结果会是 name 字段中包含 你、好、你好 的所有文档数据。

主要原因是:

当我们保存文档数据时,ES 会对数据文字进行分词、拆解操作,并将拆解后的数据保存到倒排索引当中,这样,即使使用文字的一部分也可以查询到数据。这种方式也称之为全文检索方式;当查询的时候,ES 会对查询内容进行分词,然后在倒排索引中进行匹配;分词的拆解在于词的划分,一个单词为一个词,每个汉字可以为一个词。 19、完全匹配

当我们不想对内容进行完全匹配,即不想使用全文检索的分词匹配时需要将 "match" 参数改为 "match_phrase" 参数:

curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据:

{ "query": { "match_phrase": { "name": "你好" } } } "match_phrase" 参数表示对内容进行完全匹配,不进行分词匹配。 20、高亮显示结果 curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据:

{ "query": { "match": { "name": "你好" } }, "highlight": { "fields": { "name": {} } } }

结果如下:

{ "hits": [ { "_index": "demo", "_type": "_doc", "_id": "1004", "_score": 2.55236, "_source": { "name": "你好", "sex": "woman", "age": 555 }, "highlight": { "name": [ "你好" ] } } ] } 高亮显示使用的是 "highlight" 参数,里面填写要高亮的字段;这里的意思是:对查询结果进行高亮显示,高亮的字段为 name 字段值;从查询结果来看,所谓的高亮就是对结果进行样式设定,比如这里的 。 21、聚合查询 curl -X GET http://localhost:9200/demo/_search -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体数据:

{ "aggs": { // 聚合操作 "age_group": { // 统计结果名称,随意起名 "terms": { // 分组 "field": "age" // 分组字段 } } } } 聚合查询相当于统计分组,使用的是 aggs 参数,不再是 query 参数了;aggs 参数中填写统计结果的名称,可以随意起;terms 参数表示对结果进行分组,里面填写要分组的字段,这里表示对 age 字段进行分组统计。

结果如下(展示部分内容):

{ "aggregations": { "age_group": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": 666, "doc_count": 2 }, { "key": 111, "doc_count": 1 } ] } } } 结果表示:age 字段值为 666 的文档数量(doc_count)一共有 2 个,值为 111 的有 1 个。

查询的结果其实还包含了具体的数据,如果我们只想返回统计结果而不像要具体数据的话可以添加 size 参数:

{ "aggs": { // 聚合操作 "age_group": { // 统计结果名称,随意起名 "terms": { // 分组 "field": "age" // 分组字段 } } }, "size": 0 // 不返回具体数据 }

当然统计还有其它,比如统计平均值:

{ "aggs": { // 聚合操作 "age_avg": { // 统计结果名称,随意起名 "avg": { // 平均值 "field": "age" // 分组字段 } } }, "size": 0 // 不返回具体数据 }

结果如下:

{ "aggregations": { "age_avg": { "value": 475.7142857142857 } } } 22、映射关系

在 MySQL 中,一个表,它的字段、类型、长度等信息都属于表的结构信息,在 ES 中也有类似的概念,这些就称之为映射。

1)创建映射:

curl -X PUT http://localhost:9200/demo/_mapping -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数为:

{ "properties": { "name": { "type": "text", "index": true }, "sex": { "type": "keyword", "index": true }, "age": { "type": "keyword", "index": false } } } 创建映射使用的是 PUT 请求,使用 _mapping 命令,这里表示对 demo 索引进行属性映射操作;属性映射使用 "properties" 参数,里面要填写需要映射的属性字段;属性字段中的 "type" 参数表示查询类型:text 表示可以分次进行全文本检索、keyword 表示不能分词,必须完整匹配;属性字段中的 "index" 参数表示是否进行索引,true 表示可以被索引、查询,如果为 false 表示不能被检索、查询;这里的请求参数意思是:对 demo 索引进行属性映射,其中, name 字段为全文检索,sex 字段为完全匹配,age 字段为不索引。

注意: 当添加数据时,ES 会对数据添加全文本索引属性,所以,如果已经添加了数据,此时再进行映射字段为 keyword 的话就会出错,所以进行映射的时候要注意。

2)查询索引的字段映射:

curl -X GET http://localhost:9200/demo/_mapping/_doc

3)添加映射字段

curl -X PUT http://localhost:9200/demo/_mapping/_doc -d "{请求体}" -H "content-type: application/json; charset=UTF-8"

请求体参数为:

{ "properties": { "address": { "type": "text", "index": true } } }

注意: 字段只能添加,一旦添加无法删除也无法修改。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3