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表示不存在拓扑序列。判断是否存在拓扑…...
猫咪掉毛很严重,家中猫毛该如何清理?快来看资深铲屎官经验分享
想必铲屎官们都见识过换毛季的威力。拿我家举例,养了一只长毛,一只短毛,打扫完不用半天,家里就能重新出现不少猫毛。严重的时候,每天都要扫地机器人扫三次,拖一次。 最近两天外出,回来给它们梳…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
