小言_互联网的博客

【Elasticsearch】kibana 操作es文档详细总结

365人阅读  评论(0)

前言

在上一篇,分享了使用kibana如何对索引进行增删改查等操作,事实上在日常开发与运维中,操作索引毕竟是比较谨慎的事情,但是对于索引中文档的增删查改却是随处可见的,es对文档的操作不仅频繁,而且涉及到的点比较多,本文将分享对文档的基本的操作;

一、给文档添加数据

首先创建一个索引

PUT test_doc

使用 put 给文档添加一条数据

 执行上面的语句发现报错了,因为es中的文档数据需要唯一性标识,因此需要添加一个id,修改下执行语句


  
  1. PUT test_doc/_doc/ 1001
  2. {
  3. "id": 1001,
  4. "name": "jerry",
  5. "age": 12
  6. }

再次执行后就可以了 

使用 post 给文档添加一条数据

使用post同样可以达到目的,参考下面的语句


  
  1. POST test_doc/_doc
  2. {
  3. "id": 1002,
  4. "name": "mike",
  5. "age": 15
  6. }

 与put不同的是,post不需要强制在请求URL中添加id值,而是自动为当前这条数据生成一个_id;

二、查询索引文档数据

按照id值进行查询

查询单个数据

GET test_doc/_doc/1001

查询索引下所有文档数据

GET test_doc/_search

三、修改文档数据

使用put进行修改

根据主键值id进行修改


  
  1. PUT test_doc/_doc/ 1001
  2. {
  3. "id": 1001,
  4. "name": "jerry",
  5. "age": 12
  6. }

可以看到在这种情况下,新增了一个字段仍然可以修改成功 

四、删除文档数据

根据主键id值进行删除

DELETE test_doc/_doc/1001

 删除后再次查询,数据被删掉了

五、文档搜索

文档搜索是es最强大的功能之一,也是架构设计之初选择es的一个重要原因,es对于文档的搜索提供了丰富的API,下面通过一些实际的操作演示来感受下es文档搜索的强大之处;

前置准备

创建一个索引 test_query,并给这个索引下批量插入一些数据


  
  1. PUT test_query
  2. PUT test_query/_bulk
  3. { "index": { "_index": "test_query", "_id": "1001"}}
  4. { "id": "1001", "name": "zhang san", "age":30}
  5. { "index": { "_index": "test_query", "_id": "1002"}}
  6. { "id": "1002", "name": "li si", "age": 40}
  7. { "index": { "_index": "test_query", "_id": "1003"}}
  8. { "id": "1003", "name": "wang wu", "age" : 50}
  9. { "index": { "_index": "test_query", "_id": "1004"}}
  10. { "id": "1004", "name": "zhangsan", "age" : 30}
  11. { "index": { "_index": "test_query", "_id": "1005"}}
  12. { "id": "1005", "name": "lisi", "age":40}
  13. { "index": { "_index": "test_query", "_id": "1006"}}
  14. { "id": "1006", "name ": "wangwu", "age" : 50}

单个字段相关查询

1、查询某个索引下的所有数据

GET 索引名称/_search

2、使用match匹配某个字段的关键词

比如name字段中包含 zhangsan 的文档


  
  1. GET test_query/_search
  2. {
  3. "query": {
  4. "match": {
  5. "name": "zhangsan"
  6. }
  7. }
  8. }

 要注意的是,这种方式查询的结果,表示name 中只要包含了zhangsan这个完整的关键词的文档都会查询出来,因为默认情况下,如果我们未对索引中的字段进行属性映射文件的设置的话,es会对字段进行分词处理;

比如我们再增加下面这条数据


  
  1. POST test_query/_doc
  2. {
  3. "id": "1007",
  4. "name": "zhang wu",
  5. "age":37
  6. }

再次使用 zhang 这个关键词进行name字段查询时,可以看到下面的效果,简而言之:使用match查询时会带有分词效果;

3、使用term精确匹配某个字段的关键词

精准匹配name等于zhangsan这个词的文档,term的效果就像mysql语法中的 where name="XXX"


  
  1. GET test_query/_search
  2. {
  3. "query": {
  4. "term": {
  5. "name": {
  6. "value": "zhangsan"
  7. }
  8. }
  9. }
  10. }

4、查询结果中过滤某些不需要的字段

某些情况下,不需要查询结果中返回所有的字段,就可以通过添加"_source"进行限制


  
  1. GET test_query/_search
  2. {
  3. "_source": [ "name", "age"],
  4. "query": {
  5. "match": {
  6. "name": "zhang"
  7. }
  8. }
  9. }

多条件组合查询

组合查询的关键语法是需要在查询条件中使用bool关键字

1、查询name中含有zhang或age为40的数据

这个需求类似于mysql 中的or的语法,在es中使用should可以满足类似的需求


  
  1. GET test_query/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "should": [
  6. [
  7. {
  8. "match":{
  9. "name": "zhang"
  10. }
  11. },
  12. {
  13. "match":{
  14. "age":40
  15. }
  16. }
  17. ]
  18. ]
  19. }
  20. }
  21. }

2、查询文档中name中必须含有zhang或者age必须大于等于30岁的数据

组合使用should和must


  
  1. GET test_query/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. [
  7. {
  8. "match":{
  9. "name": "zhang"
  10. }
  11. }
  12. ]
  13. ],
  14. "should": [
  15. {
  16. "range": {
  17. "age": {
  18. "gte": 30
  19. }
  20. }
  21. }
  22. ]
  23. }
  24. }
  25. }

查询结果排序

查询name中含有 zhang或li的文档,并按照age排序


  
  1. GET test_query/_search
  2. {
  3. "query": {
  4. "match": {
  5. "name": "zhang"
  6. }
  7. },
  8. "sort":[
  9. {
  10. "age" : {
  11. "order": "desc"
  12. }
  13. }
  14. ]
  15. }

分页查询

语法

GET 索引名称/_search
{
  "query": {
    "match_all": {}
  },
  "from": 0,        //从第几条开始查询
  "size": 2         //每次查询多少数据
}

看下面的查询结果


  
  1. GET test_query/_search
  2. {
  3. "query": {
  4. "match_all": {}
  5. },
  6. "from": 0,
  7. "size": 2
  8. }

聚合查询

实际业务中,经常会涉及到对查询的结果根据某个或者某些字段进行聚合,类似于mysql中的group by语法;

需求1:根据age将查询结果进行分组聚合

 注意点:这里 "size"设置为0表示查询结果中不展示其他非聚合结果的信息;


  
  1. GET test_query/_search
  2. {
  3. "aggs": {
  4. "aggAge": {
  5. "terms": {
  6. "field": "age"
  7. }
  8. }
  9. },
  10. "size": 0
  11. }

需求2:查询年龄大于等于40岁的,并将结果按照age分组聚合


  
  1. GET test_query/_search
  2. {
  3. "query": {
  4. "range": {
  5. "age": {
  6. "gte": 40
  7. }
  8. }
  9. },
  10. "aggs": {
  11. "aggAge": {
  12. "terms": {
  13. "field": "age"
  14. }
  15. }
  16. },
  17. "size": 0
  18. }

查询结果如下

 需求3:根据age分组聚合,再对聚合后的结果按照age求平均值


  
  1. GET test_query/_search
  2. {
  3. "aggs": {
  4. "ageAgg": {
  5. "terms": {
  6. "field": "age"
  7. },
  8. "aggs": {
  9. "avgAgg": {
  10. "avg": {
  11. "field": "age"
  12. }
  13. }
  14. }
  15. }
  16. },
  17. "size": 0
  18. }

查询结果如下

 需求4:获取结果集中的前N个数据


  
  1. GET test_query/_search
  2. {
  3. "aggs": {
  4. "top3": {
  5. "top_hits": {
  6. "size": 3
  7. }
  8. }
  9. },
  10. "size": 0
  11. }

查询结果如下

 需求5:获取结果集中按照age字段排序后求取前N个数据


  
  1. GET test_query/_search
  2. {
  3. "aggs": {
  4. "top3": {
  5. "top_hits": {
  6. "sort": [
  7. {
  8. "age" : {
  9. "order": "desc"
  10. }
  11. }
  12. ],
  13. "size": 3
  14. }
  15. }
  16. },
  17. "size": 0
  18. }

查询结果如下


转载:https://blog.csdn.net/congge_study/article/details/127838487
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场