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


    前言

    在上一篇,分享了使用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. }

    查询结果如下

  • 相关阅读:
    Web自动化测试进阶:网页中难点之expected_ conditions的应用与原理
    腾讯产品经理的自动化工作流
    python垃圾自动清理机制
    Git将本地仓库上传到github
    FreeSWITCH dtmf事件测试
    17-Explain执行计划-01
    Feign踩坑源码分析--@FeignClient注入容器
    面试官:请求转发和请求重定向有什么区别?
    【Qt-17】Qt调用matlab生成的dll库
    计算机网络(二) | 网络编程基础、Socket套接字、UDP和TCP套接字编程)
  • 原文地址:https://blog.csdn.net/congge_study/article/details/127838487