ES 模糊查询 wildcard 的替代方案探索
一、Wildcard 概述

Wildcard 是一种支持通配符的模糊检索方式。在 Elasticsearch 中,它使用星号 * 代表零个或多个字符,问号 ? 代表单个字符。
其使用方式多样,例如可以通过 {"wildcard": {"field_name": "value"}} 的形式进行查询。适用场景通常包括召回率要求高的业务场景,当基于分词的全文检索无法满足需求,如基础词库不完备或分词粒度不精确时,Wildcard 可以发挥作用。
然而,Wildcard 也存在一些可能的风险和局限性。从性能角度看,它可能会增加查找匹配项所需的迭代次数,降低搜索性能。尤其当通配符位于检索字段的开头,或者输入的字符串长度过长时,可能导致执行速度极慢,甚至报错。此外,若对用户输入的字符串长度不做限制,可能会造成 CPU 使用率过高、集群宕机等严重后果。
在适用范围上,Wildcard 也有一定的局限性。例如,它不支持依赖于单词位置的查询,如短语查询,并且运行 wildcard 查询时,将忽略任何重写参数,得分总是一个恒定的分数。
二、替代方案
(一)Ngram 分词优化
Ngram 分词通过更细粒度的切分方式来提高数据召回。在配置方面,我们可以设置 min_gram 和 max_gram 参数来控制分词的长度范围。例如,将 min_gram 设置为 1 ,max_gram 设置为 3 ,可以对输入文本进行更细致的切分。在使用时,需要在创建索引或更新字段类型时进行相应配置,指定分析器为 ngram_analyzer 。这样,在搜索时就能更精准地匹配用户输入的模糊查询条件,提高召回效果。
(二)Match_phrase 结合 Ngram
将 match_phrase 与 Ngram 分词相结合,可以进一步增强模糊查询效果。当用户输入模糊查询条件时,先通过 Ngram 分词将查询条件切分成多个词项,然后 match_phrase 会确保这些词项在文档中的顺序一致,从而更准确地匹配用户的意图。例如,对于输入的 “quick fox”,Ngram 分词可能会得到 “qui”“uic” 等词项,match_phrase 会在文档中查找这些词项且顺序一致的部分,提高查询的准确性和相关性。
(三)Wildcard 字段类型
ES 7.9 版本引入的 wildcard 字段类型为模糊查询提供了新的解决方案。其使用方式较为简单,先定义一个 wildcard 类型的字段,如 PUT my-index-000001{"mappings": {"properties": {"my_wildcard": {"type": "wildcard"}}}} ,然后写入文档,最后通过类似 GET my-index-000001/_search{"query": {"wildcard": {"my_wildcard": "*quite*lengthy"}}} 的查询语句进行搜索。
其原理在于使用了两种数据结构来加速通配符和正则表达式搜索,一是字符串中所有 3 个字符序列的 n-gram 索引,二是完整原始文档值的 “二进制 doc value” 存储。
这种新的字段类型具有明显的优势,在空间大小上与原索引相差不大,而在查询效率方面,对于区分度低的模糊查询场景,优化效率约为之前的 1/3 ,对于区分度高的场景,优化效率约为之前的 1/15 ,显著提升了模糊查询的性能。
三、方案对比与选择
(一)优势对比
- Ngram 分词优化:优势在于能实现更细粒度的切分,从而提高数据召回率。尤其适用于对召回精度要求较高,且基础词库不完善的情况。但可能会增加索引大小和计算成本。
- Match_phrase 结合 Ngram:将顺序匹配和细粒度切分相结合,能够更准确地理解用户意图,提高查询的准确性和相关性。不过配置和使用相对复杂。
- Wildcard 字段类型:新的字段类型显著提升了模糊查询的性能,尤其是在区分度不同的场景下均有优化。使用方式相对简单,对空间大小影响较小。
(二)适用情况
- 当数据量较大,对召回率要求高,但对查询准确性要求相对较低时,可优先选择 Ngram 分词优化。
- 对于需要精准理解用户输入意图,且对查询准确性和相关性要求极高的场景,Match_phrase 结合 Ngram 更为合适。
- 若注重查询性能的提升,同时希望使用方式简单,且对空间影响不大,Wildcard 字段类型是较好的选择。
在实际应用中,应根据具体的业务需求、数据特点和性能要求,综合考虑各方案的优势和适用情况,选择最适合的替代方案。
四、实践案例
假设我们有一个电商平台,需要根据用户输入的模糊关键词搜索相关商品。在过去,使用传统的 Wildcard 查询时,由于性能问题和局限性,导致搜索结果不准确且响应速度慢。
采用 Ngram 分词优化方案:
我们对商品的名称、描述等字段进行了 Ngram 分词优化。例如,对于商品 “红色连衣裙”,经过 Ngram 分词处理后,可能会得到 “红”“红色”“色连”“连衣裙” 等词项。当用户输入 “红色裙” 进行搜索时,能够更准确地召回相关商品,提高了召回率,用户能够更快地找到自己想要的商品。
Match_phrase 结合 Ngram 方案应用:
当用户输入 “夏季时尚上衣” 这样的模糊查询条件时,先通过 Ngram 分词将其切分成 “夏季”“季时”“时尚”“尚上”“上衣” 等词项,然后 match_phrase 确保这些词项在商品描述中的顺序一致。比如,只有商品描述中同时出现 “夏季 时尚 上衣” 这样顺序的商品才会被召回,大大提高了查询的准确性和相关性,为用户提供了更符合其需求的搜索结果。
Wildcard 字段类型的实践:
假设我们定义了一个 wildcard 类型的字段来存储商品的特殊属性,比如促销标签。当用户输入 “限时” 这样的通配符查询时,能够快速准确地找到带有 “限时折扣”“限时优惠” 等标签的商品,提升了搜索效率,同时没有显著增加存储成本。
通过以上实践案例,可以明显看到替代方案在实际场景中的有效应用,为电商平台的搜索功能带来了显著的改进,提升了用户的购物体验。
五、总结与展望
在本文中,我们深入探讨了 Elasticsearch 中 Wildcard 模糊查询的替代方案。
总结而言,Ngram 分词优化通过更细粒度的切分提高了召回率,适用于对召回精度有要求的场景;Match_phrase 结合 Ngram 能更准确地理解用户意图,在对查询准确性和相关性要求极高的情况下表现出色;Wildcard 字段类型则在查询性能和空间占用方面具有优势,使用相对简单。
展望未来,随着数据量的不断增长和用户对搜索体验要求的提高,这些替代方案可能会进一步优化和融合。例如,Ngram 分词的算法可能会更加智能,以更好地平衡索引大小和召回效果;Match_phrase 与 Ngram 的结合可能会更加紧密,提供更灵活和精确的查询方式;Wildcard 字段类型或许会在支持更多复杂的通配符模式和提高处理大规模数据的能力上有所突破。
同时,随着技术的发展,可能会出现新的模糊查询技术和策略,与现有方案相互补充和完善,为 Elasticsearch 的模糊查询提供更强大、更高效的解决方案,以满足不断变化的业务需求和用户期望。

相关文章:
ES 模糊查询 wildcard 的替代方案探索
一、Wildcard 概述 Wildcard 是一种支持通配符的模糊检索方式。在 Elasticsearch 中,它使用星号 * 代表零个或多个字符,问号 ? 代表单个字符。 其使用方式多样,例如可以通过 {"wildcard": {"field_name": "value&…...
Linux安装MQTT 服务器(图文教程)
MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,专为低带宽和不稳定的网络环境设计,非常适合物联网(IoT)应用。 官网地址:https://www.emqx.com/ 一、版本选择 根据自己…...
【TCP】核心机制:延时应答、捎带应答和面向字节流
文章目录 延时应答捎带应答面向字节流粘包问题方案一:指定分隔符方案二:指定数据的长度 TCP 报头首部长度保留(6 位)选项序号确认序号 延时应答 尽可能降低可靠传输带来的性能影响 提升性能>让滑动窗口变大 如果我们立即返回 …...
题解:AT_abc352_e [ABC352E] Clique Connect
[题目通道]([ABC352E] Clique Connect - 洛谷) 鄙人今日写人生第一篇题解 希望管理大大通过 首先,我们先看题: 它说一共有n个点,m回操作。。。 每次操作 都有 一个Ki 和 Ci Ki代表有Ki个点,Ci代表每条边所赋的边权 一看就知道这是个最小生成树的板子…...
【代码随想录训练营第42期 Day32打卡 - 从零开始动态规划 - LeetCode 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯
目录 一、做题心得 二、动规五步走 三、题目与题解 题目一:509. 斐波那契数 题目链接 题解1:记忆性递归 题解2:动态规划 题目二:70. 爬楼梯 题目链接 题解:动态规划 题目三:746. 使用最小花费爬楼…...
源码构建LAMP
目录 一、安装Apache 二、安装Mysql 三、安装PHP 四、安装论坛 一、安装Apache 1.cd 到opt目录下面,将压缩包拉进Xhell 2.解压缩apr和httpd压缩包 tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar xf httpd-2.4.29.tar.bz2 3.将apr-1.6.2 移动到ht…...
Java:封装树结构
实体类 public class DictTreeselectVO {private String value;private String label;/*** 节点*/private String parentId;private List<DictTreeselectVO> children new ArrayList<DictTreeselectVO>();public String getValue() {return value;}public void s…...
linux内核 pintrl子系统
1、什么是pinctrl子系统 在 Linux 内核中,pinctrl子系统是一个专门用于管理和控制 SoC引脚复用和配置的子系统。SoC 通常具有大量的引脚(pin),这些引脚可以被配置为不同的功能,比如 GPIO(通用输入输出&…...
网络通信要素
网络介绍 定义:将具有独立功能的多台计算机通过通信线路和通信设备连接起来,在网络管理软件及网络通信协议下,实现资源共享和信息传递的虚拟平台。 学习网络的目的: 能够编写基于网络通信的软件或程序,通常来说就是网…...
day03_作业
一、简答题 继承的格式与好处 格式:class A extends B 好处:1.可以实现代码的复用,将共性的代码向上抽取,抽取到父类中。需要使用这些属性和行为的类,通过继承即可使用。2.当需要添加新的功能时,可以通过…...
pyinstaller程序打包,资源嵌入exe
参考:https://blog.csdn.net/qq_48979387/article/details/132359366 一、参数说明 -F 最终打包为一个可执行文件。-w 取消Windows显示窗口-add-data ‘dll;dll’,将当前目录dll下的文件打包到可执行文件的dll中,最终会在解压文件的dll文件…...
如何使用 OCR 和 GPT-4o mini 轻松提取收据信息
利用 OCR 和强大的 GPT-4o 迷你模型对收据进行信息提取 利用 OCR 和强大的 GPT-4o 迷你模型对收据进行信息提取 欢迎来到雲闪世界。,我将向您展示如何从收据中提取信息,并提供收据的简单图像。首先,我们将利用 OCR 从收据中提取信息。然后&a…...
go 事务
事务处理 首先启动事务时一定要做错误判断建议在启动事务之后马上写defer方法在defer方法内对err进行判断,如果全局中有err!nil就回滚全局中err都为nil则提交事务在提交事务之后我们可以定义一个钩子函数afterCommit,来统一处理事务提交后的逻辑。 示例…...
C,数据结构,多进程线程,网络编程面试题总结
目录 1.指针数组和数组指针 2.结构体字节对齐 3.Tcp和Udp的区别 4.同步通信和异步通信的区别 5.多线程理解 6.大小端验证 7.互斥锁相关问题 8.共享内存特点 9.c中的指针 10.Gcc编译 11.Socket的了解 12.Ip地址和子网掩码如何决定网卡所在的网段 13.数据结构中栈与…...
【Cesium学习】着色器详解【待进一步总结】
在Cesium中,drawCommand 和 CustomShader 是与渲染管线和自定义渲染效果相关的两个重要概念,但它们各自有不同的作用和应用场景。下面我将分别详解这两个概念。 drawCommand drawCommand 是 Cesium 渲染引擎内部使用的一个概念,它代表了单个…...
【3】静态路由(Static routing)
目录 一、有类路由和无类路由 二、路由的基本知识 三、配置 路由的组成: 四、特殊——默认路由 五、优点和缺点 六、实验 数据通信是双向的,路由器不同的接口属于不同的广播域和冲突域 一、有类路由和无类路由 有类路由:有ABC类别之…...
阿里声音项目Qwen2-Audio的部署安装,在服务器Ubuntu22.04系统——点动科技
阿里声音项目Qwen2-Audio的部署安装,在服务器Ubuntu22.04系统——点动科技 一、ubuntu22.04基本环境配置1.1 更换清华Ubuntu镜像源1.2 更新包列表:2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有…...
RAG(检索增强生成)
RAG (Retrieval-Augmented Generation) 是一种自然语言处理的模型架构,主要用于生成性任务,如文本生成、对话系统等。RAG 将检索和生成两个任务结合起来,以提高生成结果的质量和相关性。 RAG 模型的主要思想是通过检索阶段获取相关的上下文信…...
AcWing848有向图的拓扑排序
拓扑排序的流程: 插入(a,b),表示a->b的关系,调用add(a,b),每次吧b的入度1,d[b]; 然后调用topsort,返回1表示存在拓扑序列,返回0表示不存在拓扑序列。判断是否存在拓扑…...
猫咪掉毛很严重,家中猫毛该如何清理?快来看资深铲屎官经验分享
想必铲屎官们都见识过换毛季的威力。拿我家举例,养了一只长毛,一只短毛,打扫完不用半天,家里就能重新出现不少猫毛。严重的时候,每天都要扫地机器人扫三次,拖一次。 最近两天外出,回来给它们梳…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
拟合问题处理
在机器学习中,核心任务通常围绕模型训练和性能提升展开,但你提到的 “优化训练数据解决过拟合” 和 “提升泛化性能解决欠拟合” 需要结合更准确的概念进行梳理。以下是对机器学习核心任务的系统复习和修正: 一、机器学习的核心任务框架 机…...
