ES-组合与聚合

news2024/12/26 11:03:45

ES组合查询

1 must
满足两个match才会被命中

GET /mergeindex/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "liyong"
          }
        },
        {
          "match_phrase": {
            "desc": "liyong"
          }
        }
      ]
    }
  }
}

2 must 可以换成filter,这样可以不用计算score 这样性能更好。

GET /mergeindex/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "name": "liyong"
          }
        },
        {
          "match_phrase": {
            "desc": "liyong"
          }
        }
      ]
    }
  }
}

3 should 类似于SQL中的 or

GET /mergeindex/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "liyong"
          }
        },
        {
          "match_phrase": {
            "desc": "liyong"
          }
        }
      ]
    }
  }
}

bool 支持嵌套但是不推荐。
4 must 与 filter 组合使用
这个时候会限制性filter然后再执行must,也就是预处理,先过滤掉一部分数据。

GET /mergeindex/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "liyong"
          }
        },
        {
          "match_phrase": {
            "desc": "liyong"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "salary": {
              "gte": 0,
              "lte": 190000
            }
          }
        }
      ]
    }
  }
}

5 filter 和 should 一起使用
有可能会有一个问题,就是should不工作,需要加上一个兜底条件minimum_should_match : 1 最好是加上。

GET /mergeindex/_search
{
  "query": {
    "bool": {
     #should 至少要匹配一个
     "minimum_should_match" : 1, 
      "should": [
        {
          "match": {
            "name": "liyong"
          }
        },
        {
          "match_phrase": {
            "desc": "liyong"
          }
        }
      ]
    }
  }
}

ES聚合

GET /demo/_search
{
  "size" : 0, #不返回hints 减少数据量
  "aggs": { #固定语法
    "age": { #自定义名字
      "terms": {
        "field": "age", #根据年龄进行聚合
        "size": 10
      }
    }
  }
}

在这里插入图片描述
需要注意点是如果是文本则不能直接聚合,需要使用keyworkd

GET /product/_search
{
  "size": 0, 
   "aggs": {
    "age": {
      "terms": {
        "field": "tags.keyword", # 这里不能填 tags 因为默认会被拆分,然后每个元素都是text类型
        "size": 10 #限制桶的数量 如果填1 就只返回一个聚合结果
      }
    }
  }
}

在这里插入图片描述
status 可以一下统计常见的数值

GET /demo/_search
{
  "size": 0, 
   "aggs": {
    "age_status": {
      "stats": {
        "field": "age"
      }
    }
  }
}

在这里插入图片描述
也可以分开来写

GET /demo/_search
{
  "size": 0,
  "aggs": {
    "max_age": {
      "max": {
        "field": "age"
      }
    },
    "min_age": {
      "min": {
        "field": "age"
      }
    },
    "sum_age": {
      "sum": {
        "field": "age"
      }
    },
    "avg_age": {
      "avg": {
        "field": "age"
      }
    },
    "count": {
      "value_count": {
        "field": "age"
      }
    }
  }
}

在这里插入图片描述

去重


GET /demo/_search
{
  "size": 0,
  "aggs": {
   "distinct_name" : {
     "cardinality": {
       "field": "age" #去除重复的年龄有几个种类
     }
   }
  }
}

在这里插入图片描述
聚合嵌套

GET demo/_search
{
  "size": 0,
  "aggs": {
    "age_bucket": {
      "terms": {
        "field": "name.keyword"
      },
      "aggs": { #这个案例演示aggs是可以嵌套的
        "age_bulk": {
          "avg": {
            "field": "age"
          }
        }
      }
    },
    "min_bucket": {
      "min_bucket": {
        "buckets_path": "age_bucket>age_bulk" #固定语法 直接筛选出了 年龄最小的
      }
    }
  }
}

在这里插入图片描述
先筛选再聚合

GET product/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 1000
      }
    }
  }, # 先筛选出数据 在进行聚合
  "aggs": {
    "type_bucket": {
      "terms": {
        "field": "type.keyword" #根据type进行分组
      }
    }
  }
}

排序

GET /product/_search?size=0
{
  "aggs": {
    "tags_aggs": {
      "terms": {
        "field": "tags.keyword",
        "size": 10,
        "order": {
          "_key": "asc" #根据_count来排序 通过数量来排序
        }
      }
    }
  }
}

嵌套排序

#不返回hits中的数据
GET /product/_search?size=0 
{
  "aggs": {
    "first_sort": {
      "terms": {
        "field": "tags.keyword",
        "order": {
          "_count": "desc"
        }
      },
      "aggs": {
        "second_sort": {
          "terms": {
            "field": "type.keyword",
            "order": {
              "_count": "desc"
            }
          }
        }
      }
    }
  }
}

自定义排序


GET /product/_search?size=0 #指定不返回hints
{
  "aggs": {
    "type_price": {
      "terms": {
        "field": "type.keyword",
        "order": {
          #过滤的名字 第二个过滤器有多个止值可以用.来指定
          #指定聚合那个字段排在前面
          "agg_stats>stats.min": "asc" 
        }
      },
      "aggs": {
        "agg_stats": {
          "filter": {
            "terms": {
              "tags.keyword": [
                "88vip",
                "tmall"
              ]
            }
          },
          "aggs": {
            "stats": {
              "stats": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
} 
#先根据type分类然后 根据tags 筛选 再 根据最小值进行排序

直方图
首先来看这样一个例子

GET /product/_search?size=0
{
  "aggs": {
    "price_range": {
      "range": {
        "field": "salary",
        "ranges": [
          {
            "from": 0,
            "to": 1000
          },
          {
            "from": 1000,
            "to": 2000
          },
          {
            "from": 2000,
            "to": 3000
          },
          {
            "from": 3000,
            "to": 4000
          }
        ]
      }
    }
  }
}

在这里插入图片描述
这里相当于做一个统计,但是需要一个一个定义,类似于坐标轴x,可以有更简单的写法

GET /product/_search?size=0
{
  "aggs": {
    "price_range": {
     "histogram": {
       "field": "salary",
       "interval": 1000 #坐标间距
      
     }
    }
  }
}


GET /product/_search?size=0
{
  "aggs": {
    "price_range": {
     "histogram": {
       "field": "salary",
       "interval": 1000,
       "missing": 0, #如果为空值就为0
       "min_doc_count": 1 #小于1的不展示 依据doc_count属性
     }
    }
  }
}

在这里插入图片描述
时间直方图

GET /product/_search
{
  "aggs": {
    "price_range": {
      "date_histogram": {
        "field": "date",
        #看月度数据
        "calendar_interval": "month", #year day
        #看2023-01 - 06的数据
        "extended_bounds": {
          "min": "2023-01",
          "max": "2023-06"
        }
      }
    }
  }
}

水位

GET /product/_search
{
  "size" : 0,
  "aggs": {
    "salary_range": {
      "percentile_ranks": {
        "field": "salary",
        "values": [
          1000,
          2000,
          3000,
          4000
        ]
      }
    }
  }
}

它的意思是,有27%的数据薪水不超过1000, 有38%的薪水不超过2000,以此类推吧
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1317391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Next.js 学习笔记(一)——安装

安装 系统要求: Node.js 18.17 或更高版本支持 macOS、Windows(包括 WSL)和 Linux 自动安装 我们建议使用 create-next-app 启动一个新的 Next.js 应用程序,该应用程序会自动为你设置所有内容。要创建项目,请运行&…

HPV治疗期间如何预防重复感染?谭巍主任讲述具体方法

众所周知,人乳头瘤病毒(HPV)是一种常见的性传播疾病,感染后可能会引起生殖器疣、宫颈癌等疾病。在治疗期间,预防重复感染非常重要。今日将介绍一些预防HPV重复感染的方法。 1. 杜绝不洁性行为 在治疗期间,患者应该避免与感染HPV…

SQL、Jdbc、JdbcTemplate、Mybatics

数据库:查询(show、select)、创建(create)、使用(use)、删除(drop)数据库 表:创建(【字段】约束、数据类型)、查询、修改(alter *add)、删除 DML:增加(inse…

R语言|分面中嵌入趋势线

简介 关于分面的推文,小编根据实际科研需求,已经分享了很多技巧。例如: 分面中添加不同表格 分面中添加不同的直线 基于分面的面积图绘制 分面中的细节调整汇总 基于分面的折线图绘制 最近科研中又遇到了与分面相关的需求:…

Java 第12章 异常 本章作业

1 编程 两数相除的异常处理 各自属于哪些异常: 数据格式不正确 NumberformatException 缺少命令行参数 ArrayIndexOutOfBoundsException 除0异常处理 ArithmeticException ArrayIndexOutOfBoundsException 为数组下标越界时会抛出的异常,可以在检测到命…

day20_22mysql数据库(简单了解)

为什么使用数据库 数据出存储在哪里? 硬盘,光盘,U盘,网盘,内存(临时数据) 为什么数据库 数据储存在哪里? 硬盘、网盘、U盘、光盘、内存(临时存储) 数据…

[密码学]AES

advanced encryption standard,又名rijndael密码,为两位比利时数学家的名字组合。 分组为128bit,密钥为128/192/256bit可选,对应加密轮数10/12/14轮。 基本操作为四种: 字节代换(subBytes transformatio…

Python MySQL数据库连接与基本使用

一、应用场景 python项目连接MySQL数据库时,需要第三方库的支持。这篇文章使用的是PyMySQL库,适用于python3.x。 二、安装 pip install PyMySQL三、使用方法 导入模块 import pymysql连接数据库 db pymysql.connect(hostlocalhost,usercode_space…

深入了解Linux网络配置:常见面试问题及解答

学习目标: 解释Linux网络配置的重要性和作用引入常见的面试问题 学习内容: 如何查看当前系统的IP地址和网关信息? 解答:可以使用ifconfig命令来查看当前系统的IP地址和网关信息。通过运行ifconfig命令,将会列出所有可…

【C++】STL 容器 - string 字符串操作 ⑤ ( string 字符串查找 | find 函数查找字符串 | rfind 函数查找字符串 )

文章目录 一、string 字符查找 - find 函数查找字符串1、string 类 find 函数原型说明2、代码示例 - 字符串查找3、代码示例 - 统计字符串子串 二、string 字符查找 - rfind 函数查找字符串1、string 类 rfind 函数原型说明2、代码示例 - rfind 字符串查找 一、string 字符查找…

如何查看PHP信息

创建一个 PHP 文件&#xff0c;比如 info.php&#xff0c;在其中添加以下代码&#xff1a; <?php phpinfo(); ?>访问这个文件&#xff08;例如&#xff0c;在浏览器中输入 http://localhost/info.php&#xff09;&#xff0c;它会显示 PHP 的所有配置信息。在这个页面…

论文降重同义词替换的实践经验与改进建议 快码论文

大家好&#xff0c;今天来聊聊论文降重同义词替换的实践经验与改进建议&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;论文降重同义词替换的实践经验与改…

Linux 下的PROC虚拟文件夹的介绍

#江南的江 #每日鸡汤&#xff1a;其一半亩方塘一鉴开,天光云影共徘徊。问渠哪得清如许?为有源头活水来 #初心和目标&#xff1a;在网络安全中崭露头角 PROC 一.proc的文件里的文件是对于计算机的基本信息的介绍。 其中数字文件是代表着进程&#xff0c;其余的例如cpuinfo…

[NOI2015] 程序自动分析(并查集)

题解 最后的结果与约束条件的顺序无关&#xff0c;可以先考虑相等条件&#xff0c;再考虑不等条件。由于题目中i和j的数据范围较大&#xff0c;需要用到离散化。 代码 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>…

01 整体代码运行流程

文章目录 01 整体代码运行流程1.1 运行官方 Demo1.2 变量命名规则1.3 多线程1.4 线程锁1.5 SLAM 主类 System 01 整体代码运行流程 1.1 运行官方 Demo 以 stereo_kitti 为例&#xff0c;执行 ./stereo_kitti path_to_vocabulary path_to_settings path_to_sequence./stereo_…

FLStudio2024版本新增功能及21.3版本安装下载教程

FLStudio21.0.2.3中文版完整下载是最好的音乐开发和制作软件也称为水果循环。它是最受欢迎的工作室&#xff0c;因为它包含了一个主要的听觉工作场所。最新FL有不同的功能&#xff0c;如它包含图形和音乐音序器&#xff0c;帮助您使完美的配乐在一个美妙的方式。此程序可用于Mi…

目标检测应用场景—数据集【NO.18】银杏果目标检测数据集

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

gazebo中手动控制ur5机械臂

创建工作空间 cd ~ mkdir -p catkin_ws/src cd ~/catkin_ws/src 下载代码 ~/catkin_ws/src$ git clone https://github.com/dairal/ur5-joint-position-control.git ~/catkin_ws/src$ cd .. ~/catkin_ws$ catkin_make ~/catkin_ws$ source devel/setup.bash 安装ros-contro…

[LeetCode周赛复盘] 第 376 场周赛20231217

[LeetCode周赛复盘] 第 376 场周赛20231217 一、本周周赛总结100149. 找出缺失和重复的数字![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/347f99d7222f4b8a9c9b14fdff240e4d.png)2. 思路分析3. 代码实现 100161. 划分数组并满足最大差限制1. 题目描述2. 思路分析…

【LeetCode刷题-树】--173.二叉搜索树迭代器

173.二叉搜索树迭代器 本题就是实现二叉树的中序遍历&#xff0c;利用数组本身实现迭代器 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.va…