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 的模糊查询提供更强大、更高效的解决方案,以满足不断变化的业务需求和用户期望。

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

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

相关文章

IP in IP 协议

IP in IP 是一种多重IP协议,即:客户机可以发送一个IP协议内部在嵌套一个IP协议到某个特定的主机上,在由具体的主机作为路由进行转发的协议。 例如: IP in IP帧协议结构为,第一层为发送到IP in IP 路由主机的报文&…

Vmware Workstation Pro 17.5.2最新版安装-免费使用

安装要求: Windows 10 或 11 操作系统(64位) 兼容的多核 64 位(x86)处理器(1.3GHz 或更高) 至少 4GB 内存(建议越大越好) 至少 1.2GB 可用磁盘空间 BIOS/UEFI 中开启…

Leetcode 3266. Final Array State After K Multiplication Operations II

Leetcode 3266. Final Array State After K Multiplication Operations II 1. 解题思路2. 代码实现 题目链接:3266. Final Array State After K Multiplication Operations II 1. 解题思路 这一题是题目3264. Final Array State After K Multiplication Operatio…

epoll+线程池模型

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 负载均衡技术 …

网站上线流程完全手册:域名、服务器与CDN

网站上线的核心要点 需要买域名 域名备案(国内) 买服务器 把服务器IP和域名(网址)绑定 把本地网站代码文件上传到服务器上 我来先来了解下以上的概念 域名介绍 域名是网站的地址,类似于你的家在街上的位置。它让人们通过简单的名字(如 www.baidu.…

机器学习周报(8.19-8.25

文章目录 摘要Abstract1.PyTorch环境的配置及安装使用PyCharm配置环境安装配置jupyter 2.两个Python常用函数3.DataSet4.TensorBoard的使用绘制一幅坐标图使用tendorboard对一幅图片进行操作 5.torchvison中的transforms总结 摘要 在之前学习了一些机器学习相关理论之后&#…

mysql在docker中如何设置正确的时区

1.查看当前容器的时区 docker exec mysql-server date -- 此处的mysql-server是我的容器名,你也可以填容器id2.进入容器内修改时区 docker exec -it mysql-server bash -- 交互模式进入容器 date -R --容器内查看时区3.修改时区(在容器内进行修…

Clickhouse 二进制安装

下载对应版本https://github.com/ClickHouse/ClickHouse 分别选择arm64/x86_64 对应的tgz 场景是需要把ck所有文件安装指定目录,使用rpm会散布在各个目录不方便管控 下载client,common-static,server这三个 将相同的目录合并成一个(这里注意需要在l…

【算法进阶2-动态规划】最长公共子序列、欧几里得算法-分数、RSA算法-密码于加密

1 最长公共子序列 2 欧几里得算法 2.1 欧几里得算法-分数 3 RSA算法-密码于加密 1 最长公共子序列 -个序列的子序列是在该序列中删去若干元素后得 到的序列。 例:“ABCD”和“BDF”都是“ABCDEFG”的子序列最长公共子序列(LCS)问题:给定两个序列X和Y,求X和Y长度最大…

Hadoop的概念

目录 1.什么是大数据 2.Hadoop体系结构 1:HDFS(Hadoop Distributed File System) 2 :MapReduce 3:YARN(Yet Another Resource Negotiator) 3、Hadoop生态圈 4、MapReduce的原理和工作流程…

android gradle 配置国内gradle地址

1. 地址: 腾讯云镜像 Gradle下载地址:https://mirrors.cloud.tencent.com/gradle/ 阿里云镜像 Gradle下载地址:https://mirrors.aliyun.com/macports/distfiles/gradle/ 阿里云镜像 Gradle下载地址:https://mirrors.aliyun.com…

浪潮服务器主板集成RAID常见问题

★主板集成RAID出现Initialize初始化,如下图 判断及解决方案: 1.机器是否有过插拔硬盘等操作。 2.系统初始化-系统启动会非常的慢。一般为非法关机或者断电导致。 3.出现此情况耐心等待磁盘初始化完成即可。系统初始化时间以具体的数据大小来决定&#…

【Java】/* 单向链表 - 底层实现 */

【难点】&#xff1a;remove、removeAllKey 一、IList package bagfour;/*** Created with IntelliJ IDEA.* Description:* User: tangyuxiu* Date: 2024-08-20* Time: 20:58*/ public interface IList<E> {//头插法void addFirst(E data);//尾插法void addLast(E data…

Linux启动流程和Systemd特性

文章目录 内核设计流派linux启动流程1.硬件加电自检2.启动加载器bootloader3.加载kernel4.init初始化5.用户终端启动 systemdsystemd特性systemd的unitunit配置文件 systemctl管理系统服务service unit服务状态 service unit文件格式Unit段Service段Install段 内核设计流派 1.…

值得一看的大模型资源

Stanford_alpha: https://github.com/tatsu-lab/stanford_alpaca 可以大致看一下&#xff1b; https://github.com/Duxiaoman-DI/XuanYuan 金融领域模型参考 https://github.com/tloen/alpaca-lora?tabreadme-ov-file Alpaca_lora,可以找个GPU卡试一下 python finetune.py…

android 实现简易音乐播放器

音乐App 源代码 &#xff1a; 简易音乐APP源代码 1、简介 一个简易的音乐APP&#xff0c;主要练习对四大组件的应用。感兴趣的可以看看。 播放界面如下&#xff1a; 歌曲列表界面如下&#xff1a; 项目结构如下&#xff1a; 接下来将对代码做详细介绍&#xff1a; 2、Musi…

【SpringCloud Alibaba】(九)学习 Gateway 服务网关

目录 1、网关概述1.1、没有网关的弊端1.2、引入 API 网关 2、主流的 API 网关2.1、NginxLua2.2、Kong 网关2.3、Zuul 网关2.4、Apache Shenyu 网关2.5、SpringCloud Gateway 网关 3、SpringCloud Gateway 网关3.1、Gateway 概述3.2、Gateway 核心架构 4、项目整合 SpringCloud …

大模型在应用开发安全左移实践

1.应用开发安全左移势在必行 近年来&#xff0c;应用系统被入侵或敏感信息泄漏类的安全事件时有发生&#xff0c;大部分安全事件的根本原因是应用软件设计或实现中存在安全漏洞。由于软件安全性问题导致各种信息泄密、信息被篡改、网络服务中断的事件频发&#xff0c;给企业和…

【鼠鼠学AI代码合集#3】简单的数据操作 (pytorch)

简单的数据操作 &#xff08;pytorch&#xff09; 张量&#xff08;Tensor&#xff09;的基本概念 张量是由数值组成的多维数组&#xff0c;可以看作是一个通用的数据容器。它可以表示从标量&#xff08;零维&#xff09;、向量&#xff08;一维&#xff09;、矩阵&#xff0…