ElasticSearch下

news2025/3/12 22:17:54

DSL查询

  1. 叶子查询:在特定字段里查询特定值,属于简单查询,很少单独使用
  2. 复合查询:以逻辑方式组合多个叶子查询或更改叶子查询的行为方式
    • 在查询后还可以对查询结果做处理:
      • 排序:按照1个或多个字段做排序
      • 分页:根据from或size做分页,类似MySQL
      • 高亮:对搜索结果中的关键字添加特殊样式
      • 聚合:对搜索结果做数据统计以形成报表

基本语法

GET /{索引库名}/_search
{
  "query": {
    "查询类型": {
      "查询条件": "条件值"
    }
  }
}

【例】:

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

在这里插入图片描述

叶子查询

1. 全文检索查询

利用分词器对用户输入内容分词,然后去词条列表中匹配,默认按照匹配度排序。例如:match_query、multi_match_query

match查询(常用):会对用户输入的内容分词,然后去倒排索引检索,语法:

GET /{索引库名}/_search
{
  "query": {
    "match": {
      "字段名": "搜索条件"
    }
  }
}

【例】:搜索“脱脂牛奶”

GET /items/_search
{
  "query": {
    "match": {
      "name": "脱脂牛奶"
    }
  }
}

multi_match查询:与match查询类似,只不过允许查询多个字段,参与查询的字段越多,性能越差。语法:

GET /{索引库名}/_search
{
  "query": {
    "multi_match": {
      "query": "搜索条件",
      "fields": ["字段1", "字段2"]
    }
  }
}

2. 精确查询

不对用户输入的内容做分词,直接精确匹配,一般是查找keyword、数值、日期、布尔等类型。例如:ids、range、term

term查询(常用)

GET /{索引库名}/_search
{
  "query": {
    "term": {
      "字段名": {
        "value": "搜索条件"
      }
    }
  }
}

【例】:查询“牛奶”分类下的商品

GET /items/_search
{
  "query": {
    "term": {
      "category": {
        "value": "牛奶"
      }
    }
  }
}

range查询

GET /{索引库名}/_search
{
  "query": {
    "range": {
      "字段名": {
        "gte": {最小值},
        "lte": {最大值}
      }
    }
  }
}

【例】:查询价格≥5k,≤1w

GET /items/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 500000,
        "lte": 1000000
      }
    }
  }
}

ids查询
【例】:查询id为1861099和1861100的商品

GET /items/_search
{
  "query": {
    "ids": {
      "values": ["1861099", "1861100"]
    }
  }
}

3. 地理查询

用于搜索地理位置。例如:geo_distance、geo_bounding_box

复合查询

1. bool查询

基于逻辑运算组合叶子查询,实现组合条件,例如:bool

  1. must:必须匹配每个子查询(“与”)
  2. should:选择性匹配子查询(“或”)
  3. must_not:必须不匹配,不参与算分(“非”)
  4. filter:必须匹配,不参与算分(“与”)
GET /索引库名/_search {
	"query": {
		bool查询条件: {
			叶子查询
		}
	}
}

用户在输入框搜索“手机”,在底下:品牌选择“华为”,价格选择“1600以上元”。
在这里插入图片描述

GET /items/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "手机"
          }
        }
      ],
      "filter": [
        {
          "term": {
            "brand": "华为"
          }
        },
        {
          "range": {
            "price": {
              "gte": 160000
            }
          }
        }
      ]
    }
  }
}

2. 算分函数查询

基于某种算法修改查询时的文档相关性算分,从而改变文档排名。例如:function_score、dis_max

排序和分页

排序

es默认根据相关度算分(_score)来排序,也可以指定字段排序。可以排序的类型有:keyword、数值、地理坐标、日期。

GET /索引库名/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "排序字段": {
        "order": "排序方式asc和desc"
      }
    }
  ]
}

【例】:搜索“脱脂牛奶”,结果按照销量排序,销量一样按照价格升序排列

GET /items/_search
{
  "query": {
    "match": {
      "name": "脱脂牛奶"
    }
  },
  "sort": [
    {
      "sold": "desc"
    },
    {
      "price": "asc"
    }
  ]
}

分页

es默认只返回前10的数据,如果查询更多数据就需要修改分页参数。

  • from:从第几个文档开始
  • size:总共查询几个文档
    【例】:搜索“脱脂牛奶”,查询出销量前10的商品,销量一样时按照价格升序
GET /items/_search
{
  "query": {
    "match": {
      "name": "脱脂牛奶"
    }
  },
  "from": 0, // 分页开始的位置,默认为0
  "size": 10, // 每页文档数量,默认10
  "sort": [
    {
      "sold": "desc"
    },
    {
      "price": "asc"
    }
  ]
}
深度分页问题

es中from + size不能超过1w条,因为太深了会有深度分页问题。
【产生原因】因为es存储的数据很多,所以es数据一般会采用分片存储,把一个索引中的数据分成N份,存储到不同的节点上。查询时需要汇总各个分片的数据。查询的页码越深,从每个分片差的数据量越多,内存压力越大,性能越差。
【解决办法】search after模式:分页时需要排序,原理是在上一次排序后,会记住上一次的排序值,下一次排序时,就会直接从上一次排序值开始,查询下一页数据。

  • 优点:没有查询上限,支持深度分页
  • 缺点:只能向后逐页查询,不能随即翻页
  • 场景:数据迁移,手机滚动查询

高亮显示

在搜索结果中,把搜索结果突出显示
【原理】:
1. 高亮词条都加了<em>标签,标签上都添加了红色样式
2. 倒排索引在分词的时候,会把词条列表进行分词,还会记录词条在文档中的位置
在这里插入图片描述

GET /{索引库名}/_search
{
  "query": {
    "match": {
      "搜索字段": "搜索关键字"
    }
  },
  "highlight": {
    "fields": {
      "高亮字段名称": {
        "pre_tags": "<em>", // 高亮的前置标签
        "post_tags": "</em>" // 高亮的后置标签
      }
    }
  }
}

一般搜哪个字段,就对哪个字段做高亮,标签可以不加,默认是em

【例】:

GET /items/_search
{
  "query": {
    "match": {
      "name": "脱脂牛奶"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

在这里插入图片描述

JavaRestClient查询

基本语法

  1. 构建并发起请求
    在这里插入图片描述
  2. 解析查询结果
    在这里插入图片描述
@Test
void testSearch() throws IOException {
    // 1. 创建Request对象
    SearchRequest request = new SearchRequest("items");
    // 2. 配置Request参数
    request.source()
            .query(QueryBuilders.matchAllQuery());
    // 3. 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    // 4. 解析结果
    SearchHits searchHits = response.getHits();
    long total = searchHits.getTotalHits().value; // 查询的总条数
    SearchHit[] hits = searchHits.getHits(); // 查询的结果数组
    for(SearchHit hit : hits) {
        String json = hit.getSourceAsString();// 得到source
        System.out.println(json);
    }
}

叶子查询

全文检索查询

在这里插入图片描述

精确查询

在这里插入图片描述

复合查询

布尔查询

在这里插入图片描述
【例】:搜索关键字为“脱脂牛奶”,品牌为“德亚”,价格低于300元

@Test
void testSearch() throws IOException {
    // 1. 创建Request对象
    SearchRequest request = new SearchRequest("items");
    // 2. 配置Request参数
    request.source().query(
            QueryBuilders.boolQuery()
                    .must(QueryBuilders.matchQuery("name", "脱脂牛奶"))
                    .filter(QueryBuilders.termQuery("brand", "德亚"))
                    .filter(QueryBuilders.rangeQuery("price").lt(30000))
    );
    // 3. 发送请求
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    // 4. 解析结果
    parseResponseResult(response); // 对上边解析response的步骤进行了封装
}

排序和分页

在这里插入图片描述

@Test 
void testSortAndPage() throws IOException {
    SearchRequest request = new SearchRequest("items");
    int pageNo = 1, pageSize = 5;
    request.source().query(QueryBuilders.matchAllQuery()) // query条件
            .from((pageNo - 1) * pageSize).size(pageSize) // 分页条件(分页开始的位置, 每页文档数量)
            .sort("sold", SortOrder.DESC)
            .sort("price", SortOrder.ASC); // 排序条件(排序字段, 排序方式)
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    parseResponseResult(response);
}

高亮显示

在这里插入图片描述
高亮显示的结果解析:
在这里插入图片描述

@Test
void testHighLight() throws IOException {
    SearchRequest request = new SearchRequest("items");
    request.source().query(QueryBuilders.matchQuery("name", "脱脂牛奶")) // 查询条件
            .highlighter(SearchSourceBuilder.highlight().field("name")); // 高亮条件
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    parseResponseResult(response);
}

由于高亮的结果不是在source里的,所以parseResponseResult()方法需要添加对高亮的处理:

private static void parseResponseResult(SearchResponse response) {
   SearchHits searchHits = response.getHits();
   long total = searchHits.getTotalHits().value; // 查询的总条数
   SearchHit[] hits = searchHits.getHits(); // 查询的结果数组
   for(SearchHit hit : hits) {
       String json = hit.getSourceAsString();// 得到source
       ItemDoc itemDoc = BeanUtil.copyProperties(json, ItemDoc.class);

       // ===处理高亮结果===
       Map<String, HighlightField> hfs = hit.getHighlightFields();
       if(hfs != null && !hfs.isEmpty()) {
           // 根据高亮字段名获取高亮结果
           HighlightField hf = hfs.get("name");
           // 获取高亮结果后,用高亮结果覆盖非高亮结果
           String hfName = hf.getFragments()[0].string(); // 高亮结果
           itemDoc.setName(hfName); // 覆盖非高亮结果
       }
       System.out.println(itemDoc);
   }
}

数据聚合

聚合可以实现对文档数据的统计、分析、运算,聚合常见的有:

  1. 桶聚合:用来对文档做分组
    • TermAggregation(term):按照文档字段值分组
    • Date Histogram:按照日期阶梯分组,例如:一周为一组,或一月为一组
  2. 度量聚合:用来计算一些值,如:最大值、最小值、平均值
    • Avg:求平均值
    • Max:求最大值
    • Min:求最小值
    • Stats:同时求max、min、avg、sum
  3. 管道聚合:其他聚合结果为基础做聚合,聚合的数据是其他聚合的结果

参与聚合的字段必须是Keyword、数值、日期、布尔类型的字段

DSL聚合

【例1】:统计所有商品中的商品分类

# select count(1) "categroyAgg" from items group by category
GET /items/_search
{
  "query": {"match_all": {}}, // 如果使用"match_all",可以省略
  "size": 0, // 如果不设置size,默认为10,不仅会返回聚合结果,还会返回搜索结果,增加网络传输的负担
  "aggs": { // 定义聚合
    "categroyAgg": { // 给聚合起个名字
      "terms": { // 聚合的类型,按照分类聚合,所以选择term
        "field": "category", // 参与聚合的字段
        "size": 5 // 希望获取的聚合结果数量
      }
    }
  }
}

在这里插入图片描述
【例2】:统计手机的品牌,每个品牌价格的最小值、最大值、平均值

GET /items/_search
{
  "query": {
    "term": {
      "category": "手机"
    }
  },
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand"
      },
      "aggs": {
        "price_stats": {
          "stats": {
            "field": "price"
          }
        }
      }
    }
  }
}

在这里插入图片描述

JavaRestClient聚合

在这里插入图片描述
解析聚合结果:
在这里插入图片描述

@Test
void testAgg() throws IOException {
    SearchRequest request = new SearchRequest("items");
    String brandAggName = "brandAgg";
    request.source()
            .size(0) // 不返回文段,只返回聚合结果
            .aggregation(AggregationBuilders.terms(brandAggName) // 聚合类型、聚合名称
                    .field("brand") // 聚合字段
                    .size(20) // 聚合返回结果
            );
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    // 解析结果
    Aggregations aggregations = response.getAggregations();
    // 根据聚合名称获取对应的聚合
    Terms terms = aggregations.get(brandAggName); // 这里用了向下转型(Aggregation:父、Terms:子)
    // 获取buckets
    List<? extends Terms.Bucket> buckets = terms.getBuckets();
    // 遍历每一个bucket
    for (Terms.Bucket bucket : buckets) {
        System.out.println("brand:" + bucket.getKeyAsString());
        System.out.println("count:" + bucket.getDocCount());
    }
}

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

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

相关文章

读取长文本,使用读取底表

文章目录 代码有原始数据内表作为主表连接STXL的示例获取物料分类获取物料分类的文本的宏读取分类 https://blog.csdn.net/DeveloperMrMeng/article/details/118354649 代码 "第三种&#xff1a;读取底表获取文本 DATA: LT_TLINE TYPE STANDARD TABLE OF TLINE. DATA: LS…

Ubuntu升级Linux内核教程

本文作者CVE-柠檬i: CVE-柠檬i-CSDN博客 本文使用的方法是dpkg安装&#xff0c;目前版本为5.4.0-204&#xff0c;要升级成5.8.5版本 下载 下载网站&#xff1a;https://kernel.ubuntu.com/mainline/ 在该网站下载deb包&#xff0c;选择自己想要升级的版本&#xff0c;这里是5…

JWT在线解密/解码 - 加菲工具

JWT在线解密/解码 首先进入加菲工具 选择 “JWT 在线解密/解码” https://www.orcc.online 或者直接进入JWT 在线解密/解码 https://www.orcc.online/tools/jwt 进入功能页面 使用 输入对应的jwt内容&#xff0c;点击解码按钮即可

如何查看特定版本的Spring源码

写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油&#xff0c;冲鸭&#x…

安全规约、脱敏规范、敏感逻辑的保护方案、防止 SQL 注入

文章目录 I 强制性安全规约对于文件上传功能,需要对于文件大小、类型进行严格检查和控制。平台资源的防重放机制URL 外部重定向传入的目标地址必须执行白名单过滤。表单、AJAX 提交必须执行 CSRF 安全验证。禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。用户请求…

unity2022以上导出到AndroidStudio后更新步骤

1、unity里面Export出unityLibrary 2、导出apk&#xff0c;里面才包含libil2cpp(新版unity无法直接导出libil2cpp 3、注释AS项目app下的build.gradle里面包含unityLibrary的代码 4、注释AS项目settings.gradle包含unityLibrary的代码 5、删除AS项目里面的unityLibrary文件夹 6、…

LabVIEW串口通信调试与数据接收问题

在使用LabVIEW进行串口通信时&#xff0c;常常会遇到无法接收数据的情况。这可能与串口设置、连接、设备响应等多方面因素相关。本文将详细讨论如何使用LabVIEW进行串口通信&#xff0c;并提供常见问题的排查与解决方法&#xff0c;帮助用户更高效地进行数据接收调试。通过调整…

Java并发编程——线程池(基础,使用,拒绝策略,命名,提交方式,状态)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页

【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页 一、问题背景&#xff1a; 如今&#xff0c;大家都离不开各种手机应用。随着鸿蒙系统用户越来越多&#xff0c;大家都希望能在鸿蒙设备上快速找到想用的 APP。华为应用市场里有海量的 APP&#xff0c;但之前从鸿蒙设备进…

智能物流升级利器——SAIL-RK3576核心板AI边缘计算网关设计方案(一)

近年来&#xff0c;随着物流行业智能化和自动化水平不断提升&#xff0c;数据的实时处理与智能决策成为推动物流运输、仓储管理和配送优化的重要手段。传统的集中式云平台虽然具备强大计算能力&#xff0c;但高延迟和带宽限制往往制约了物流现场的即时响应。为此&#xff0c;我…

nacos环境搭建以及SpringCloudAlibaba脚手架启动环境映射开发程序

1&#xff1a;下载nacos 地址&#xff1a;https://github.com/alibaba/nacos/tags 2:选择server的zip包下载 3:启动mysql服务&#xff0c;新建数据库&#xff1a;nacos_yh 4&#xff1a;解压下载的nacos_server 进入conf目录 5&#xff1a;mysql运行sql脚本变得到下面的表 6&a…

Java中线程的学习

目录​​​​​​​ 程序,进程,线程 创建线程 继承Thread类 实现Runnable接口 Thread类中方法 线程优先级 线程状态 多线程的概念 线程同步 在Java代码中实现同步 以下代码使用继承Thread方式实现 以下代码使用实现Runnable方式实现 Lock&#xff08;锁&#xf…

HTTP/HTTPS ⑤-CA证书 || 中间人攻击 || SSL/TLS

这里是Themberfue ✨上节课我们聊到了对称加密和非对称加密&#xff0c;实际上&#xff0c;单纯地非对称加密并不能保证数据不被窃取&#xff0c;我们还需要一个更加重要的东西——证书 中间人攻击 通过非对称加密生成私钥priKey和公钥pubKey用来加密对称加密生成的密钥&…

leetcode:205. 同构字符串(python3解法)

难度&#xff1a;简单 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符的顺序。不同字符不能映射到同一个字…

从epoll事件的视角探讨TCP:三次握手、四次挥手、应用层与传输层之间的联系

目录 一、应用层与TCP之间的联系 二、 当通信双方中的一方如客户端主动断开连接时&#xff0c;仅是在客户端的视角下连接已经断开&#xff0c;在服务端的眼中&#xff0c;连接依然存在&#xff0c;为什么&#xff1f;——触发EPOLLRDHUP事件&#xff1a;对端关闭连接或停止写…

EMS专题 | 守护数据安全:数据中心和服务器机房环境温湿度监测

您需要服务器机房温度监测解决方案吗&#xff1f; 服务器机房是企业中用于存储、管理和维护服务器及其相关组件的设施。服务器机房通常位于数据中心内&#xff0c;是一个专门设计的物理环境&#xff0c;旨在确保服务器的稳定运行和数据的安全性。服务器机房主要起到存储和管理数…

运输层安全协议SSL

安全套接字层 SSL (Secure Socket Layer) SSL 作用在端系统应用层的 HTTP 和运输层之间&#xff0c;在 TCP 之上建立起一个安全通道&#xff0c;为通过 TCP 传输的应用层数据提供安全保障。 应用层使用 SSL 最多的就是 HTTP&#xff0c;但 SSL 并非仅用于 HTTP&#xff0c;而是…

网络安全面试题汇总(个人经验)

1.谈一下SQL主从备份原理&#xff1f; 答&#xff1a;主将数据变更写入自己的二进制log,从主动去主那里去拉二进制log并写入自己的二进制log,从而自己数据库依据二进制log内容做相应变更。主写从读 2.linux系统中的计划任务crontab配置文件中的五个星星分别代表什么&#xff…

51单片机 DS18B20温度储传感器

DS18B20温度传感器 64-BITROM&#xff1a;作为器件地址&#xff0c;用于总线通信的寻址&#xff0c;是唯一的&#xff0c;不可更改 SCRATCHPAD&#xff08;暂存器&#xff09;&#xff1a;用于总线的数据交互 EEPROM&#xff1a;用于保存温度触发阈值和配置参数 暂存器 单总线…

如何保证光谱相机的稳定性和可靠性

光学系统设计与制造 高质量光学元件&#xff1a;采用高精度研磨和镀膜的透镜、棱镜、光栅等光学元件。优质的透镜可以减少像差和色差&#xff0c;确保光线准确聚焦&#xff1b;高质量的镀膜能够提高光学元件的透光率&#xff0c;降低反射损失&#xff0c;并且增强对不同波段光…