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.rhkb.cn/news/3070.html

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

相关文章

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (二、首页轮播图懒加载的实现)

在开发一款影视APP时&#xff0c;首页的轮播图是一个非常重要的部分。它不仅能够吸引用户的注意力&#xff0c;还能有效地推广重点内容。为了提升应用的性能和用户体验&#xff0c;可以实现轮播图的懒加载功能。本文将详细介绍如何在HarmonyOS NEXT应用开发中实现这一功能。 1.…

GraphRAG如何使用ollama提供的llm model 和Embedding model服务构建本地知识库

使用GraphRAG踩坑无数 在GraphRAG的使用过程中将需要踩的坑都踩了一遍&#xff08;不得不吐槽下&#xff0c;官方代码有很多遗留问题&#xff0c;他们自己也承认工作重心在算法的优化而不是各种模型和框架的兼容性适配性上&#xff09;&#xff0c;经过了大量的查阅各种资料以…

Jupyter notebook中运行dos指令运行方法

Jupyter notebook中运行dos指令运行方法 目录 Jupyter notebook中运行dos指令运行方法一、DOS(磁盘操作系统&#xff09;指令介绍1.1 DOS介绍1.2 DOS指令1.2.1 DIR - 显示当前目录下的文件和子目录列表。1.2.2 CD 或 CHDIR - 改变当前目录1.2.3 使用 CD .. 可以返回上一级目录1…

Oracle报错ORA-01078、LRM-00109

虚拟机异常关机后&#xff0c;rac数据库备机无法启动数据库&#xff0c;报错如下 解决方法&#xff1a; 找到如下路径文件 执行&#xff1a; cp init.ora.016202516818 /u01/app/oracle/product/19.3.0/db/dbs/ mv init.ora.016202516818 initplm2.ora 再次进入命令行sqlpl…

AAPM:基于大型语言模型代理的资产定价模型,夏普比率提高9.6%

“AAPM: Large Language Model Agent-based Asset Pricing Models” 论文地址&#xff1a;https://arxiv.org/pdf/2409.17266v1 Github地址&#xff1a;https://github.com/chengjunyan1/AAPM 摘要 这篇文章介绍了一种利用LLM代理的资产定价模型&#xff08;AAPM&#xff09;…

大疆发布可折叠航拍无人机,仅重249g,支持 4800 万像素拍摄

在以往的无人机使用经历中&#xff0c;携带不便一直是个让人头疼不已的问题。那些体积硕大的无人机&#xff0c;每次出行都像是一场艰难的搬运&#xff0c;塞进车里都费劲&#xff0c;更别提轻松地穿梭在城市街头或是户外探险中了。但就在大家对这些问题习以为常、感到无奈时&a…

无公网IP 实现外网访问本地 Docker 部署 Navidrome

Navidrome 是一款可以在 macOS、Linux、Windows以及 Docker 等平台上运行的跨平台开源音乐服务器应用&#xff0c;它支持传输常见的 MP3、FLAC、WAV等音频格式。允许用户通过 Web 界面或 API 进行音乐库的管理和访问。本文就介绍如何快速在 Linux 系统使用 Docker 进行本地部署…

从 SQL 语句到数据库操作

1. SQL 语句分类 数据定义语言 DDL &#xff1a; 用于定义或修改数据库中的结构&#xff0c;如&#xff1a;创建、修改、删除数据库对象。create、drop alter 数据操作语言 DML &#xff1a; 用于添加、删除、更新数据库中的数据。select、insert alter、drop 数据控制语言 D…

leetcode hot100(2)

11.200.岛屿数量 本题是图论中经典的连通分量问题&#xff0c;可以用bfs/dfs解决。 class Solution {int[][] directions new int[][]{{-1,0},{0,-1},{1,0},{0,1}};public int numIslands(char[][] grid) {boolean visited[][] new boolean[grid.length][grid[0].length];i…

Kafka权威指南(第2版)读书笔记

目录 Kafka生产者——向Kafka写入数据生产者概览创建Kafka生产者bootstrap.serverskey.serializervalue.serializer 发送消息到Kafka同步发送消息异步发送消息 生产者配置client.idacks消息传递时间max.block.msdelivery.timeout.msrequest.timeout.msretries 和retry.backoff.…

虚拟拨号技术(GOIP|VOIP)【基于IP的语音传输转换给不法分子的境外来电披上一层外衣】: Voice over Internet Protocol

文章目录 引言I 虚拟拨号技术(GOIP|VOIP)原理特性:隐蔽性和欺骗性II “GOIP”设备原理主要功能III 基于IP的语音传输 “VOIP” (Voice over Internet Protocol)IV “断卡行动”“断卡行动”目的电信运营商为打击电诈的工作V 知识扩展虚拟号保护隐私虚拟运营商被用于拨打骚扰…

MySQL 事务

目录 一、什么是事务 二、事务的特性 三、事务使用案例 四、事务并发问题 五、设置事务的隔离级别&#xff08;解决读的问题&#xff09; 一、什么是事务 MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如说&#xff0c;在人员管理系统中&#xff0c;你删除…

基于Oracle与PyQt6的电子病历多模态大模型图形化查询系统编程构建

一、引言 1.1 研究背景阐述 在当今数字化时代,医疗行业正经历着深刻的变革,数字化转型的需求日益迫切。电子病历(EMR)作为医疗信息化的核心,其管理的高效性和数据利用的深度对于提升医疗服务质量、优化临床决策以及推动医学研究具有至关重要的意义。传统的电子病历管理系…

强化学习-蒙特卡洛方法

强化学习-数学理论 强化学习-基本概念强化学习-贝尔曼公式强化学习-贝尔曼最优公式强化学习-值迭代与策略迭代强化学习-蒙特卡洛方法 文章目录 强化学习-数学理论一、蒙特卡洛方法理论(Monte Carlo, MC)二、MC Basic2.1 算法拆解2.2 MC Basic算法 三、MC Exploring Starts3.1 …

Harmony面试模版

1. 自我介绍 看表达能力、沟通能力 面试记录&#xff1a; 2. 进一步挖掘 2.1. 现状 目前是在职还是离职&#xff0c;如果离职&#xff0c;从上一家公司离职的原因 2.2. 项目经验 如果自我介绍工作项目经验讲的不够清楚&#xff0c;可以根据简历上的信息再进一步了解 面试记…

eBay账号安全攻略:巧妙应对风险

在跨境电商的浪潮中&#xff0c;eBay宛如一座璀璨的灯塔&#xff0c;照亮了无数买卖双方的交易之路。但别忘了&#xff0c;网络安全的阴霾也在悄然蔓延&#xff0c;让eBay账号时刻处于黑客攻击、数据泄露、钓鱼诈骗等风险的阴影之下。别担心&#xff0c;今天就来为你支支招&…

浅谈云计算19 | OpenStack管理模块 (上)

OpenStack管理模块&#xff08;上&#xff09; 一、操作界面管理架构二、认证管理2.1 定义与作用2.2 认证原理与流程2.2.1 认证机制原理2.2.2 用户认证流程 三、镜像管理3.1 定义与功能3.2 镜像服务架构3.3 工作原理与流程3.3.1 镜像存储原理3.3.2 镜像检索流程 四、计算管理4.…

【Uniapp-Vue3】uni-api交互反馈showToast的使用方法

如果想要显示弹窗&#xff0c;就可以使用showToast去显示弹窗。 uni.showToast({ title:"显示内容", icon:"标志样式" }) 其中&#xff0c;title只能显示7个字符的内容&#xff0c;如果想要显示全&#xff0c;只能不设置icon。 icon默认是success&#xf…

LabVIEW与WPS文件格式的兼容性

LabVIEW 本身并不原生支持将文件直接保存为 WPS 格式&#xff08;如 WPS 文档或表格&#xff09;。然而&#xff0c;可以通过几种间接的方式实现这一目标&#xff0c;确保您能将 LabVIEW 中的数据或报告转换为 WPS 可兼容的格式。以下是几种常见的解决方案&#xff1a; ​ 导出…

如何异地远程访问本地部署的Web-Check实现团队远程检测与维护本地站点

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 在日常开发和维护过程中&#xff0c;确保Web应用稳定运行是至关重要的。…