Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验
目录
Elasticsearch查询分类
叶子查询
全文检索查询
match查询
multi_match查询
精确查询
term查询
range查询
复杂查询
bool查询简单应用
bool查询实现排序和分页
bool查询实现高亮
场景分析
问题思考
解决方案
search_after方案(推荐)
point in time方案
方案比较
Elasticsearch查询分类
Elasticsearch的查询可以分为两大类:
叶子查询(Leaf query clauses):一般是在特定的字段里查询特定值,属于简单查询,很少单独使用。
复合查询(Compound query clauses):以逻辑方式组合多个叶子查询或者更改叶子查询的行为方式。
叶子查询
全文检索查询
用分词器对用户输入搜索条件先分词,得到词条,然后再利用倒排索引搜索词条。
match查询
可以以一个分词,例如"GB"得到所有name中带“GB”的数据
# match查询所有
GET /items/_search
{"query": {"match": {"name": "GB"}}
}
实现效果如下:(总共有17条数据中name有“GB”)

multi_match查询
与match类似的还有multi_match,区别在于可以同时对多个字段搜索,而且多个字段都要满足,语法示例:
GET /items/_search
{"query": {"multi_match": {"query": "电脑","fields": ["name", "category"]}}
}
实现效果如下:(即name和brand都必须带“电脑”)

精确查询
不对用户输入搜索条件分词,根据字段内容精确值匹配。但只能查找keyword、数值、日期、boolean类型的字段。
term查询
# term查询所有
GET /items/_search
{"query": {"term": {"brand": {"value": "Dell"}}}
}
实现效果如下:(不在对搜索条件分词)

range查询
# range查询所有
GET /items/_search
{"query": {"range": {"price": {"gte": 10000,"lte": 200000}}}
}
实现效果如下:(对price范围查询: 10000<查询值<200000)

复杂查询
bool查询简单应用
GET /items/_search
{"query": {"bool": {"must": [{"match": {"name": "GB"}}],"filter": [{"term": {"brand": "Apple"}},{"range": {"price": {"gte": 100000,"lte": 2000000}}}]}}
}
实现效果如下:(name中要有“GB”,brand中有“Apple”,且100000<查询值<2000000)

bool查询实现排序和分页
GET /items/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "desc"},"sold": {"order": "asc"}}],"from": 0,"size": 5
}
实现效果解读:查询所有数据,先以price降序排序,price相同,以sold升序排序,一页五条。

bool查询实现高亮
我们在百度,京东搜索时,关键字会变成红色,比较醒目,这叫高亮显示。
事实上elasticsearch已经提供了给搜索关键字加标签的语法,无需我们自己编码。
GET /items/_search
{"query": {"match": {"name": "手机"}},"highlight": {"fields": {"name": {}}}
}
实现效果如下:(给手机加上了<em>标签)

场景分析
问题思考
- elasticsearch的数据一般会采用分片存储,也就是把一个索引中的数据分成N份,存储到不同节点上。这种存储方式比较有利于数据扩展,但给分页带来了一些麻烦。
- 比如一个索引库中有100000条数据,分别存储到4个分片,每个分片25000条数据。现在每页查询10条,查询第99页。
- 实现思路来分析,肯定是将所有数据排序,找出前1000名,截取其中的990~1000的部分。但问题来了,我们如何才能找到所有数据中的前1000名呢?
- 要知道每一片的数据都不一样,第1片上的第900~1000,在另1个节点上并不一定依然是900~1000名。所以我们只能在每一个分片上都找出排名前1000的数据,然后汇总到一起,重新排序,才能找出整个索引库中真正的前1000名。
解决方案
search_after方案(推荐)
search_after提供了一种基于上一次查询结果中最后一个文档的排序值来“继续”下一页的方式。这要求每次查询都必须带上前一次查询结果中的排序值,从而避免了深度分页的问题。
GET /_search
{"size": 10,"query": {"match": {"title": "elasticsearch"}},"search_after": [123456], // 上一个查询结果中的排序值"sort": [{"_id": "desc"}]
}
point in time方案
从Elasticsearch 7.10版本开始引入的point in time功能,提供了比scroll(一个过时的方案,官方弃用)更灵活的方式来遍历结果集。与scroll不同,point in time不会自动关闭搜索上下文,而是需要显式地关闭它,这样可以在一定程度上减少资源消耗。
POST /my-index/_pit?keep_alive=1m
{}GET /_search
{"size": 10,"query": {"match": {"title": "elasticsearch"}},"pit": {"id": "wmx3UmRBY1VnVUJqQlNvMzZQRVhBQT09LS1RY1hZRkRBPT0=","keep_alive": "1m"},"sort": [{"_id": "asc"}]
}
方案比较
search_after 是解决前端深度分页的最佳选择,因为它效率高且易于实现。(简单)
point in time 提供了更细粒度的控制,特别适合长时间运行的数据处理任务,并有助于优化资源管理。
相关文章:
Elasticsearch:解锁深度匹配,运用Elasticsearch DSL构建闪电般的高效模糊搜索体验
目录 Elasticsearch查询分类 叶子查询 全文检索查询 match查询 multi_match查询 精确查询 term查询 range查询 复杂查询 bool查询简单应用 bool查询实现排序和分页 bool查询实现高亮 场景分析 问题思考 解决方案 search_after方案(推荐) point in time方案 方案…...
SQLAlchemy系列教程:基本数据类型及自定义类型
在SQLAlchemy、Python SQL工具包和ORM中定义模型时,理解基本数据类型至关重要。本教程提供了在SQLAlchemy模型中有效使用内置基本类型的指南。 SQLAlchemy中的基本类型 SQLAlchemy支持一组与SQL数据库类型一致的基本数据类型。SQLAlchemy中的每种类型都为各种SQL类…...
【Wireshark 02】抓包过滤方法
一、官方教程 Wireshark 官网文档 : Wireshark User’s Guide 二、显示过滤器 2.1、 “数据包列表”窗格的弹出过滤菜单 例如,源ip地址作为过滤选项,右击源ip->prepare as filter-> 选中 点击选中完,显示过滤器&#…...
ES怎么查询大于10000条数据
在Elasticsearch(ES)中,默认情况下,查询结果的最大返回条数是10,000条。如果你需要查询超过10,000条数据,可以通过以下几种方式来实现: 1. 使用 scroll API scroll API 适用于需要处理大量数据的场景&…...
《几何原本》命题I.8
《几何原本》命题I.8 如果两个三角形有三边对应相等,那么这两个三角形的所有对应角亦相等。 若 A B D E , A C D F , B C E F ABDE,ACDF,BCEF ABDE,ACDF,BCEF 将 △ A B C \triangle ABC △ABC 平移至 △ D E F \triangle DEF △DEF,使 B C BC …...
课程2. 机器学习方法论
课程2. 机器学习方法论 训练算法并评估其质量将样本分成训练和测试。分层 交叉验证方法sklearn 接口算法模型训练模型的应用质量评估 数据预处理标准缩放Violinplot 数据集使用模型Pipeline 在上一讲中,我们讨论了机器学习专家面临的挑战。无论解决的问题类型和解决…...
ioday2----->标准io函数
思维导图: 练习: 1将当前的时间写入到time. txt的文件中,如果ctrlc退出之后,在再次执行支持断点续写 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止,再次执行程序 4.2022…...
SQL注入练习场:PHPStudy+SQLI-LABS靶场搭建教程(零基础友好版)
注意:文中涉及演示均为模拟测试,切勿用于真实环境,任何未授权测试都是违法行为! 一、环境准备 下载PHPStudy 官网下载地址:https://www.xp.cn/php-study(选择Windows版) 安装时建议选择自定…...
【笔记ing】python
1 Python基础概念及环境搭建 1.1 python简介及发展史 之父Guido van Rossum。ABC语言的替代品。Python提供了高效的数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释性语言的本质,使之成为多数平台上写脚本和快速开发应…...
DFT之SSN架构
SSN(Streaming Scan Network)架构在DFT(设计可测试性)中的应用是一种先进的设计测试解决方案,旨在应对现代大规模片上系统(SoC)设计中的复杂测试挑战。以下是对SSN架构在DFT中应用的详细分析&am…...
四十二:VSCODE打开新文件覆盖上一个文件窗口问题
VSCODE打开新文件覆盖上一个文件窗口问题_vscode enablepreview-CSDN博客...
JMeter 引入 JAR 包的几种方法
JMeter 支持加载外部 JAR 文件,用于: 扩展 JMeter 功能使用 Java 代码(BeanShell / JSR223)连接数据库 / 解析 Excel / 读取 CSV 📌 1. JMeter 引入 JAR 包的方式 ✅ 方式 1:将 JAR 放入 lib/ 或 lib/ext…...
记一次ScopeSentry搭建
介绍 Scope Sentry是一款具有资产测绘、子域名枚举、信息泄露检测、漏洞扫描、目录扫描、子域名接管、爬虫、页面监控功能的工具,通过构建多个节点,自由选择节点运行扫描任务。当出现新漏洞时可以快速排查关注资产是否存在相关组件。 目前功能 插件系…...
C语言_数据结构总结1:静态分配方式的顺序表
纯C语言代码,不涉及C 1. 初始化 #define MaxSize 50 typedef int ElemType; typedef struct SQList { ElemType data[MaxSize]; //定义一个数组存放顺序表元素 int length; //顺序表当前的长度(元素个数…...
C语言--简单排序算法(冒泡、选择、插入)
实现三种简单的排序算法 文章目录 冒泡排序改进改进2 选择排序插入排序执行结果 冒泡排序 每次外层循环,排出一个最大值 void bubbleSort(int arr[], int len) {for (int i 0; i < len - 1; i) {for (int j 0; j < len - i - 1; j) {if (arr[j] > arr[…...
【文献阅读】The Efficiency Spectrum of Large Language Models: An Algorithmic Survey
这篇文章发表于2024年4月 摘要 大语言模型(LLMs)的快速发展推动了多个领域的变革,重塑了通用人工智能的格局。然而,这些模型不断增长的计算和内存需求带来了巨大挑战,阻碍了学术研究和实际应用。为解决这些问题&…...
MySQL-高级查询
查询处理 排序(默认不是按主键排序的) order by 字段1[,字段2] [asc|desc] 默认是升序排序也可以指定 select 列表中列的序号进行排序如果是多个字段,那么在上一个字段排序完的基础上排序下一个 限制数量 limit 行数࿰…...
Netty笔记10:LengthFieldBasedFrameDecoder很简单,请看
Netty笔记1:线程模型 Netty笔记2:零拷贝 Netty笔记3:NIO编程 Netty笔记4:Epoll Netty笔记5:Netty开发实例 Netty笔记6:Netty组件 Netty笔记7:ChannelPromise通知处理 Netty笔记8:ByteBuf使用介绍 Netty笔记9:粘包半包 Netty笔记10:LengthFieldBasedFrameDec…...
linux 安装Mysql无法远程访问问题的排查
宝塔面板安装了mysql5.6后 只能本地访问 firewall 在使用宝塔面板(BT Panel)安装 MySQL 5.6 后,如果你发现 MySQL 只能本地访问,而不能从其他机器或服务访问,这通常是由于防火墙设置或 MySQL 配置的问题。以下是一些步…...
DeepSeek搭配Excel,制作自定义按钮,实现办公自动化!
今天跟大家分享下我们如何将DeepSeek生成的VBA代码,做成按钮,将其永久保存在我们的Excel表格中,下次遇到类似的问题,直接在Excel中点击按钮,就能10秒搞定,操作也非常的简单. 一、代码准备 代码可以直接询问…...
Ansys Zemax实战:用Zernike相位面给离轴反射镜‘加料’,模拟加工误差就这么简单
Ansys Zemax高阶技巧:Zernike相位面在离轴反射镜公差分析中的工程实践 在光学系统设计领域,公差分析是确保量产可行性的关键环节。当设计从理想状态走向实际制造时,加工误差、装配偏差等因素都会对系统性能产生影响。对于离轴反射镜这类非对称…...
YOLO11优化:CVPR2026 UCMNet |FrequencyCM赋能YOLO C3k2:从频域增强视角解决感受野与细节瓶颈
💡💡💡现有YOLO C3k2的问题点: 感受野受限:堆叠小核卷积(如33)难以捕获全局上下文,对尺度变化大、小目标或遮挡目标特征提取不足。 频域信息缺失:仅依赖空间域卷积,无法有效利用傅里叶域的高频细节,导致低对比度、模糊区域重建能力弱。 特征交互低效:通道间信…...
UrsPahoMqttClient 心跳问题解决指南——Paho 底层已自动处理,设好 KeepAlive 就行
UrsPahoMqttClient 心跳问题解决指南 ——Paho 底层已自动处理,设好 KeepAlive 就行 问题 用 UrsPahoMqttClient 做 MQTT 连接时,心跳 PingReq 报文怎么发送?目的是保持连接,防止被 Broker 踢下线。 结论 不需要手动发心跳&#x…...
LeetCode 前K个高频元素题解
LeetCode 前K个高频元素题解 题目描述 给定一个数组,找到前 k 个高频元素。 示例: 输入:nums [1,1,1,2,2,3], k 2输出:[1,2] 解题思路 方法:堆 思路: 使用哈希表统计每个元素出现的次数。使用最小堆维护前…...
将taotoken作为统一api层整合到企业内部多个ai应用场景中
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 将taotoken作为统一api层整合到企业内部多个ai应用场景中 在企业内部,AI应用正变得无处不在。从智能客服系统自动回复用…...
SQL-lab通关教程
Less-1单引号型完整注入流程打开靶场第一关你会看到如下图所示界面,由为方便后续靶场的payload输入查看,我这里了将直接利用hackbar进行sql注入测试。第1步:确认闭合方式payload:http://127.0.0.1:8080/Less-1/?id1分析ÿ…...
手把手教你用FPGA+摄像头搭建一个图像处理系统(从采集到以太网传输)
从零构建FPGA图像处理系统:硬件选型到以太网传输实战指南 在嵌入式视觉领域,FPGA因其并行处理能力和低延迟特性,成为实时图像处理的理想平台。本文将带您完整实现一个基于OV7670摄像头和Xilinx Artix-7 FPGA的图像采集处理系统,涵…...
离散数学自然推理系统通关秘籍:从零开始手把手教你搞定Educoder所有证明题
离散数学自然推理系统通关秘籍:从零到精通的实战指南 1. 自然推理系统入门基础 对于初次接触离散数学自然推理系统的学习者来说,那些复杂的符号和规则往往让人望而生畏。但请记住,每个专家都曾是初学者。自然推理系统本质上是一种形式化的逻…...
ASTM D999-08 (2015) 全解析|运输包装容器振动测试标准完整版
前言ASTM D999-08 (2015)《运输集装箱的振动测试》是全球运输包装领域最经典的正弦振动与往复冲击测试标准,覆盖往复冲击振动、单件共振、托盘 / 集合包装共振三大类测试场景,广泛用于评估包装在运输振动环境下的强度与防护能力,同时等效满足…...
3分钟搞定B站缓存视频转换:m4s-converter无损合并完整指南
3分钟搞定B站缓存视频转换:m4s-converter无损合并完整指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的情…...
