ElasticSearch下

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();// 得到sourceSystem.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();// 得到sourceItemDoc 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:子)// 获取bucketsList<? extends Terms.Bucket> buckets = terms.getBuckets();// 遍历每一个bucketfor (Terms.Bucket bucket : buckets) {System.out.println("brand:" + bucket.getKeyAsString());System.out.println("count:" + bucket.getDocCount());}
}

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

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

相关文章

牛客----mysql

查找除复旦大学的用户信息_牛客题霸_牛客网 题目&#xff1a;现在运营想要查看除复旦大学以外的所有用户明细包括的字段有 device_id、gender、age、university&#xff0c;请你取出相应数据 示例&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male…

Android SystemUI——CarSystemBar车载状态栏(九)

上一篇文章我们介绍了车载开发中的 CarSystemUI,而车载开发中的状态栏也被 CarSystemBar 所取代,这里我们就来看看一下车载系统中的状态栏——CarSystemBar。 一、车载状态栏创建 1、CarSystemBar 源码位置:/packages/apps/Car/SystemUI/src/com/android/systemui/car/sy…

java根据模板导出word,并在word中插入echarts相关统计图片以及表格

引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题&#xff0c;需要处理将ftl文件中的图片的Base64删除&#xff0c;并使用占位符代替插入表格&#xff0c;并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…

链式前向星的写法

【图论02】动画说图的三种保存方式 降低理解门槛 邻接表 链式前向星 邻接矩阵_哔哩哔哩_bilibili 杭电ACM刘老师-算法入门培训-第12讲-拓扑排序及链式前向星_哔哩哔哩_bilibili 图论003链式前向星_哔哩哔哩_bilibili&#xff08;链式前向星的遍历&#xff09; head数组的下标…

Trie(算法版)

#include <iostream>using namespace std;const int N100010; int son[N][26],cnt[N],idx; //son记录trie数&#xff0c;cnt记录每个词出现的次数&#xff0c;idx记录每个字符所占⽤的下标//加入字符串 void add(char str[]){//idx 0既表⽰根节点也表⽰空节点int p 0;fo…

软件工程导论

第 1 章 软件工程学概述&#xff1a;介绍了软件危机的表现、产生原因及消除途径&#xff0c;阐述了软件工程的定义、基本原理和方法学&#xff0c;还讲解了软件生命周期和软件过程的相关概念&#xff0c;包括瀑布模型、快速原型模型等多种软件开发模型当当。第 2-8 章 软件生命…

想品客老师的第一天:值类型使用

前面两章的摘要 ECMAscript&#xff08;也就是ES&#xff09;是JavaScript的一个标准&#xff0c;就像c的c11和c99一样&#xff0c;几把的一年出一套标准 freeze()是一个对象方法&#xff0c;表示锁定、固定一个对象不可改变&#xff08;因为const对于标量不可变&#xff0c;…

容器渗透横向

本质上要获得 1.获得容器IP段 2.获得主机IP段 3.获得本机IP 4.通过CNI或Docker0等扫描本机端口 Flannel 容器信息 rootubuntu-linux-22-04-desktop:/home/parallels/Desktop# k get po -A -o wide NAMESPACE NAME …

贪心算法(题1)区间选点

输出 2 #include <iostream> #include<algorithm>using namespace std;const int N 100010 ;int n; struct Range {int l,r;bool operator <(const Range &W)const{return r<W.r;} }range[N];int main() {scanf("%d",&n);for(int i0;i&l…

解决本地运行MR程序访问权限问题

文章目录 1. 提出问题2. 解决问题2.1 临时解决方案2.2 永久解决方案 3. 小结 1. 提出问题 运行DeduplicateIPsDriver类&#xff0c;抛出如下异常&#xff1a; 该错误信息表明在尝试运行 DeduplicateIPsDriver 类时&#xff0c;遇到了 HDFS&#xff08;Hadoop 分布式文件系统&a…

【学习总结|DAY032】后端Web实战:登录认证

在 Web 后端开发中&#xff0c;登录认证是保障系统安全和用户数据隐私的关键环节。本文将结合实际开发案例&#xff0c;深入探讨登录功能与登录校验的实现思路和技术细节&#xff0c;希望能帮助读者更好地掌握这一重要知识点。 一、登录功能实现 1.1 思路分析 登录功能的核心…

html全局遮罩,通过websocket来实现实时发布公告

1.index.html代码示例 <div id"websocket" style"display:none;position: absolute;color:red;background-color: black;width: 100%;height: 100%;z-index: 100; opacity: 0.9; padding-top: 30%;padding-left: 30%; padding-border:1px; "onclick&q…

sqlmap使用手册

sqlmap使用手册 一、sqlmap简介二、sqlmap常用命令三、sqlmap使用示例四、注意事项sqlmap使用手册 sqlmap是一个开源的渗透测试工具,主要用于自动检测和利用SQL注入漏洞来接管数据库服务器。以下是对sqlmap的详细介绍和使用指南: 一、sqlmap简介 sqlmap具有强大的检测引擎和…

高通8255 Android STR 启动失败要因分析调查

目录 背景&#xff1a; 调查过程&#xff1a; 步骤1&#xff1a; slog2info | grep vmm_service 步骤2&#xff1a; slog2info | grep qvm 总结&#xff1a; 解决方案 背景&#xff1a; 调试高通8255 STR的STR过程中发现Android和QNX进入STR状态后&#xff0c;脱出STR时…

Linux UDP 编程详解

一、引言 在网络编程领域&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;作为一种轻量级的传输层协议&#xff0c;具有独特的优势和适用场景。与 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff0…

数据增强方法及其工具

数据增强&#xff08;Data Augmentation&#xff09;是指在训练深度学习模型时&#xff0c;通过对现有数据进行一系列变换&#xff0c;从而生成新的样本。数据增强有助于增加数据的多样性&#xff0c;减少过拟合&#xff0c;提升模型的泛化能力&#xff0c;尤其是在数据量有限的…

整数在计算机眼中是什么样子的呢?

整数类型 在现实世界中&#xff0c;整数是无穷的。但在计算机中&#xff0c;由于内存资源的有限性&#xff0c;我们只能表示有限范围的整数。 1. 整数类型的分类 在编程语言(如Java)中&#xff0c;整数类型主要分为以下几种&#xff1a; byte: 1个字节&#xff0c;范围[-12…

【Pandas】pandas Series apply

Pandas2.2 Series Function application, GroupBy & window 方法描述Series.apply()用于将一个函数应用到 Series 的每个元素或整个 Series pandas.Series.apply pandas.Series.apply 是 Pandas 库中 Series 对象的一个方法&#xff0c;用于将一个函数应用到 Series 的…

SDL2:arm64下编译使用 -- SDL2多媒体库使用音频实例

SDL2&#xff1a;Android-arm64端编译使用 2. SDL2&#xff1a;Android-arm64端编译使用2.1 安装和配置NDK2.2 下载编译SDL22.3 SDL2使用示例&#xff1a;Audio2.4 Android设备运行 2. SDL2&#xff1a;Android-arm64端编译使用 在Linux系统上使用Android NDK编译和使用arm64下…

Ubuntu服务器折腾集

目录 Ubuntu 更改软件源Ubuntu 系统语言英文改中文windows 远程链接 Ubuntu 图形界面Windows 通过 openssh 连接 UbuntuUbuntu linux 文件权限Ubuntu 空闲硬盘挂载到 文件管理器的 other locationsUbuntu 开启 SMB 服务&#xff0c;并通过 windows 访问DockerseafileNextcloud…