• 【四】ElasticSearch 文档操作:增删改、高级搜索、聚合搜索,倒排索引


    1、文档基础操作

    ES 是面向文档操作的。文档相当于数据库中的单行数据。命令行中加上 _doc (除查询所有文档命令)

    1.1、PUT POST创建文档

    1.1.1、PUT 创建文档

    PUT 索引名/_doc/文档ID {}

    • 需要手动指定ID

    • _doc 表示文档,即数据

    • 当索引不存在时,会自动创建索引

    • 如果创建的文档数据已存在,会成为更新操作,因为有唯一的文档ID

    // 需要手动指定ID;_doc表示文档,即数据
    PUT test_index_2/_doc/1003
    {
      "name": "test3",
      "age": 23
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    在这里插入图片描述

    1.1.2、POST 创建文档

    POST 索引名/_doc/文档ID(可有可无) {}

    • 可以不指定文档ID,会自动生成文档ID

    • 可以指定文档ID

    • 当索引不存在时,会自动创建索引

    • 不指定文档ID,重复创建时,每次都是新建,会产生新数据

    • 指定文档ID,重复创建时,成为更新操作

    • 不指定文档ID(自动生成随机文档ID)
    // 不指定文档ID;会自动创建文档ID
    POST test_index_4/_doc
    {
      "name": "test3",
      "age": 23
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    • 指定文档ID;与 PUT 操作一致
    // 指定文档ID
    POST test_index_4/_doc/1010
    {
      "name": "test3",
      "age": 23
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    在这里插入图片描述

    1.1.3、区别

    区别PUTPOST
    文档ID需要手动指定可以手动指定;
    可以省略(自动创建)
    索引不存在时自动创建索引自动创建索引
    指定文档ID,重复创建更新操作更新操作
    不指定文档ID,重复创建— 不可以 —创建操作,产生新数据

    1.2、GET 查询文档

    1.2.1、查询特定文档

    GET 索引名称/_doc/文档ID

    GET test_index_3/_doc/1004
    
    • 1

    在这里插入图片描述

    1.2.2、查询所有文档

    GET | POST 索引名称/_search

    • 可以使用 GETPOST

    • 索引名称后面加 _search,不需要 _doc

    GET test_index_3/_search
    
    
    POST test_index_3/_search
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    1.3、PUT POST修改文档

    PUT | POST 索引名称/_doc/文档ID

    • 可以使用 PUTPOST

    • 必须指定文档ID

    • 更新时可以为文档添加新的属性字段

    • 如果当前ID的文档不存在,就是创建操作

    // 如果当前ID的文档不存在,就是创建操作
    
    PUT test_index_3/_doc/1004
    {
      "name": "test3",
      "age": 23
    }
    
    // 更新时添加新的字段 sex
    POST test_index_3/_doc/1004
    {
      "name": "test3",
      "age": 23,
      "sex": "男"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    1.4、DELETE 删除文档

    DELETE 索引名称/_doc/文档ID

    • 必须指定文档ID
    DELETE test_index_3/_doc/1004
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    2、文档高级搜索

    可以使用 GETPOST

    准备数据:

    idnameage
    1004zhang san24
    1005zhangsan25
    1006li si26
    1007lisi27
    1008zhang san 12328
    1009li si 12329
    1010zhang ming30
    1011liu san31

    2.1、分词匹配搜索

    • 分词匹配 match

    • 名字name中包含 zhangsan 的都可以查出来

    • 其中 zhangsan 不能匹配 zhangsan ,因为 zhangsanzhangsan 是三个不同的关键字,所以 1005 文档查不出来

    // 可以使用 GET 或 POST
    // 分词匹配;名字name中包含 zhang 或 san 的都可以查出来
    Get test_index/_search
    {
        "query": {
            "match": {
                "name": "zhang san"
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    在这里插入图片描述

    2.2、完全匹配搜索

    • 完全匹配 term

    • 名字name中包含 zhang san 的才可以查出来; zhang san 是一个 整体

    • 虽然有名字为 zhang san 的文档,但该文档保存时,是以分词的形式,即 zhangsan 是分开的,所以作为整体是查不到的

    // 完全匹配;名字name中包含 `zhang san` 的才可以查出来
    //  `zhang san` 是一个整体
    Get test_index/_search
    {
        "query": {
            "term": {
                "name": {
                    "value": "zhang san"
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    // 关键字 zhangsan,是一个整体,中间无空格
    POST test_index/_search
    {
      "query": {
        "term": {
          "name": {
            "value": "zhangsan"
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    2.3、搜索全部数据

    match_all 不需要指定条件

    GET test_index/_search
    {
      "query": {
        "match_all": {}
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.4、指定字段搜索

    "_source": ["字段名1","字段名2"]

    GET test_index/_search
    {
      "query": {
        "match": {
          "name": "zhang li"
        }
      },
      "_source": ["name"]
    }
    
    
    POST test_index/_search
    {
      "query": {
        "term": {
          "name": {
            "value": "zhang"
          }
        }
      },
      "_source": ["name","age"]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    2.5、多条件搜索

    类似于 or ;有一个条件满足即可

    GET test_index/_search
    {
        "query": {
            // 布尔 boolean
            "bool": {
                // 条件集
                "should": [
                    // 条件1:名字中含有 si
                    {
                        "match": {
                            "name": "si"
                        }
                    },
                    // 条件2:年龄是 28
                    {
                        "term": {
                            "age": 28
                        }
                    }
                ]
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在这里插入图片描述

    2.6、排序搜索

    POST test_index/_search
    {
      // 分词匹配;名字中含有 zhang 或 si 的都可以  
      "query": {
        "match": {
          "name": "zhang si"
        }
      },
      // 按年龄倒序排列
      "sort": [
        {
          "age": {
            "order": "desc"
          }
        }
      ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    2.7、分页搜索

    POST test_index/_search
    {
      "query": {
        "match": {
          "name": "zhang si"
        }
      },
      // 起始文档序号;从0开始;
      // 起始文档序号 = (页码 -1) * 页面文档数size
      "from": 0,
      // 页面文档数
      "size": 2
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    3、文档聚合搜索

    GETPOST 都可以

    增加新数据

    idnameage
    1012zhang san 45625
    1013li si 45625

    3.1、分组搜索

    按年龄分组搜索,查询每个年龄的人数

    GET test_index/_search
    {
        "aggs": { // 聚合查询
             ”ageGroup“: { // 查询结果名称
                "terms": {
                    "field": "age" // age字段
                }
            }   
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    "size": 0
    
    • 1

    在这里插入图片描述

    3.2、求和

    按年龄分组,再求出该组中的年龄之和

    GET test_index/_search
    {
      "aggs": { 
       "ageGroup": {
          "terms": {
            "field": "age" 
          },
          "aggs": {
            "ageSum": {
              "sum": {
                "field": "age"
              }
            }
          }  
        }
      },
      "size": 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    3.3、平均值

    GET test_index/_search
    {
      "aggs": { // 聚合查询
        "avgAge": { // 查询结果名称
          "avg": { // avg 表示求平均值
            "field": "age"
          }
        }
      },
      "size": 0 // 只要聚合结果,不要具体文档数据
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    3.4、查前几个

    GET test_index/_search
    {
      "aggs": {
        "top2": { // 查询结果名称
          "top_hits": { // 查前几个
            "size": 2
          }
        }
      },
      "size": 0
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    • 指定字段、排序
    GET test_index/_search
    {
      "aggs": {
        "top2": {
          "top_hits": {
            "_source": ["name"], // 只显示 name
            "sort": [
              {
                "age": {
                  "order": "desc" // 按年龄倒序排列
                }
              }
            ], 
            "size": 2 // 查前2个
          }
        }
      },
      "size": 0 // 只要聚合结果,不要具体文档数据
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

  • 相关阅读:
    DBCO-C3-Maleimide,CAS号:1629057-08-4,DBCO-C3-马来酰亚胺,二苯并环辛炔-碳3-马来酰亚胺
    算法练习(11):牛客在线编程07 动态规划
    优秀的程序员不是你的尽头,而是起点
    Python常用视频编辑操作——读取与保存视频、更改帧数、拼接视频、视频语音合并、视频与图像互转等
    如何通过API接口获取item_get - 获得淘宝商品详情
    tf.math
    92-Java的缓冲流概述、体系、字节缓冲流使用
    JavaScript小技能:原型链的运作机制、Promise链
    jquery设置图片可手动拖拽
    RabbitMQ如何保证顺序性
  • 原文地址:https://blog.csdn.net/tu_wer/article/details/126864674