【四】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.1.2、POST 创建文档

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

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

  • 可以指定文档ID

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

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

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

1.1.3、区别

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

1.2、GET 查询文档

1.2.1、查询特定文档

GET 索引名称/_doc/文档ID

GET test_index_3/_doc/1004

在这里插入图片描述

1.2.2、查询所有文档

GET | POST 索引名称/_search

  • 可以使用 GETPOST

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

GET test_index_3/_search


POST test_index_3/_search

在这里插入图片描述

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.4、DELETE 删除文档

DELETE 索引名称/_doc/文档ID

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

在这里插入图片描述

在这里插入图片描述

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"
        }
    }
}

在这里插入图片描述

在这里插入图片描述

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"
            }
        }
    }
}

在这里插入图片描述

// 关键字 zhangsan,是一个整体,中间无空格
POST test_index/_search
{
  "query": {
    "term": {
      "name": {
        "value": "zhangsan"
      }
    }
  }
}

在这里插入图片描述

2.3、搜索全部数据

match_all 不需要指定条件

GET test_index/_search
{
  "query": {
    "match_all": {}
  }
}

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"]
}

在这里插入图片描述

2.5、多条件搜索

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

GET test_index/_search
{
    "query": {
        // 布尔 boolean
        "bool": {
            // 条件集
            "should": [
                // 条件1:名字中含有 si
                {
                    "match": {
                        "name": "si"
                    }
                },
                // 条件2:年龄是 28
                {
                    "term": {
                        "age": 28
                    }
                }
            ]
        }
    }
}

在这里插入图片描述

2.6、排序搜索

POST test_index/_search
{
  // 分词匹配;名字中含有 zhang 或 si 的都可以  
  "query": {
    "match": {
      "name": "zhang si"
    }
  },
  // 按年龄倒序排列
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

在这里插入图片描述

2.7、分页搜索

POST test_index/_search
{
  "query": {
    "match": {
      "name": "zhang si"
    }
  },
  // 起始文档序号;从0开始;
  // 起始文档序号 = (页码 -1) * 页面文档数size
  "from": 0,
  // 页面文档数
  "size": 2
}

在这里插入图片描述

3、文档聚合搜索

GETPOST 都可以

增加新数据

idnameage
1012zhang san 45625
1013li si 45625

3.1、分组搜索

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

GET test_index/_search
{
    "aggs": { // 聚合查询
         ”ageGroup“: { // 查询结果名称
            "terms": {
                "field": "age" // age字段
            }
        }   
    }
}

在这里插入图片描述

"size": 0

在这里插入图片描述

3.2、求和

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

GET test_index/_search
{
  "aggs": { 
   "ageGroup": {
      "terms": {
        "field": "age" 
      },
      "aggs": {
        "ageSum": {
          "sum": {
            "field": "age"
          }
        }
      }  
    }
  },
  "size": 0
}

在这里插入图片描述

3.3、平均值

GET test_index/_search
{
  "aggs": { // 聚合查询
    "avgAge": { // 查询结果名称
      "avg": { // avg 表示求平均值
        "field": "age"
      }
    }
  },
  "size": 0 // 只要聚合结果,不要具体文档数据
}

在这里插入图片描述

3.4、查前几个

GET test_index/_search
{
  "aggs": {
    "top2": { // 查询结果名称
      "top_hits": { // 查前几个
        "size": 2
      }
    }
  },
  "size": 0
}

在这里插入图片描述

  • 指定字段、排序
GET test_index/_search
{
  "aggs": {
    "top2": {
      "top_hits": {
        "_source": ["name"], // 只显示 name
        "sort": [
          {
            "age": {
              "order": "desc" // 按年龄倒序排列
            }
          }
        ], 
        "size": 2 // 查前2个
      }
    }
  },
  "size": 0 // 只要聚合结果,不要具体文档数据
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

土味儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值