当前位置: 首页 > news >正文

第二阶段 15 · prefix / wildcard / fuzzy 模糊匹配

15 · prefix / wildcard / fuzzy 模糊匹配

阶段:第二阶段 / 查询能力
ES 查询:prefix/wildcard/fuzzy| PostgreSQL 对照:LIKE 'abc%'/LIKE '%x%'/ 模糊纠错


1. 概念

三种「非精确」匹配,都作用在keyword(或 text 的词项)上:

ES 查询作用SQL 对应
prefix前缀匹配LIKE 'abc%'
wildcard通配符匹配(*多字符,?单字符)LIKE '%x%'/LIKE 'a?c'
fuzzy允许拼写误差(编辑距离)PG 没有直接语法(近似pg_trgm

⚠️ 这三种都可能很慢(尤其前置通配*abc),生产环境慎用大范围。


2. PostgreSQL 对照

-- prefixSELECT*FROMsalesdataWHEREinvoice_numberLIKE'INV-2026%';-- wildcard(包含)SELECT*FROMsalesdataWHEREinvoice_numberLIKE'%2026%';-- fuzzy(拼写容错,PG 需 pg_trgm 扩展)SELECT*FROMsalesdataWHEREmaterial%'ThinkPd';-- 相似度

3. ES DSL

prefix(前缀)

GET salesdata_idx/_search { "query": { "prefix": { "invoice_number": "INV-2026" } } }

wildcard(通配符)

GET salesdata_idx/_search { "query": { "wildcard": { "invoice_number": "*2026*" } } }

fuzzy(拼写容错)

GET salesdata_idx/_search { "query": { "fuzzy": { "material": { "value": "ThinkPd", "fuzziness": "AUTO" } } } }

fuzziness: AUTO会根据词长自动决定允许的编辑距离(通常 1~2)。


4. Spring Boot 实现

@ComponentpublicclassDoc15FuzzyQuery{@AutowiredprivateElasticsearchClientelasticsearchClient;/** LIKE 'prefix%' */publicList<Map<String,Object>>prefix(StringindexName,Stringfield,Stringprefix)throwsIOException{SearchResponse<Map>resp=elasticsearchClient.search(s->s.index(indexName).query(q->q.prefix(p->p.field(field).value(prefix))),Map.class);returntoSourceList(resp);}/** LIKE '%pattern%',pattern 里用 * 和 ? */publicList<Map<String,Object>>wildcard(StringindexName,Stringfield,Stringpattern)throwsIOException{SearchResponse<Map>resp=elasticsearchClient.search(s->s.index(indexName).query(q->q.wildcard(w->w.field(field).value(pattern))),Map.class);returntoSourceList(resp);}/** 拼写容错 */publicList<Map<String,Object>>fuzzy(StringindexName,Stringfield,Stringvalue)throwsIOException{SearchResponse<Map>resp=elasticsearchClient.search(s->s.index(indexName).query(q->q.fuzzy(f->f.field(field).value(value).fuzziness("AUTO"))),Map.class);returntoSourceList(resp);}privateList<Map<String,Object>>toSourceList(SearchResponse<Map>resp){returnresp.hits().hits().stream().map(Hit::source).filter(Objects::nonNull).collect(Collectors.toList());}}

5. 坑与最佳实践

  1. 前置通配符*abc极慢:等于全表扫倒排词典,能避免就避免;必要时用wildcard字段类型或 n-gram。
  2. 作用在keyword:对分词后的text用 wildcard 结果常常反直觉。
  3. 大小写keyword默认大小写敏感,wildcard也是。需要不敏感可加case_insensitive: true(8.x 支持)。
  4. fuzzy 有性能代价:编辑距离越大越慢,AUTO通常够用。
  5. 能用prefix就别用wildcard:前缀匹配比通配快得多。

下一篇

16-match_phrase-短语.md

http://www.jsqmd.com/news/1301776/

相关文章:

  • 从几个开源项目浅谈IOS视频流输出方案
  • 专科生论文写作工具对比:千笔与文途AI深度评测
  • 工具型PM发现Axure再熟练也画不出Agent的产品体验,开始重新学设计AI产品
  • RK平台SENSOR框架分析
  • 终极免费AI视频增强神器:3步将模糊视频无损升级到4K超高清
  • 内蕴时空正则化纲领:分形时间重构消解Navier–Stokes有限时间奇点
  • git多人开发流程
  • G-Helper终极指南:释放华硕笔记本隐藏性能的免费轻量级工具
  • 清华智谱开源发布ScaleCUA:可扩展的任务合成和在线强化学习 GUI Agent框架,9B模型刷新开源SOTA
  • 大语言模型选型指南:从技术原理到生产部署的实践路径
  • 祈盟游戏运营平台?业务范围、合作流程与适用团队说明
  • ComfyUI LLM Party终极指南:三步构建你的AI智能工作流
  • 1688货源对接抖店一件代发|密文下单+AI违规预检完整实操流程(2026合规标准版) - 电商分享
  • Python打字游戏开发:从零实现GUI打字速度练习工具
  • STM32定时器同步触发启动:硬件级精准时序控制实战指南
  • 无线动能开关|户外露天快递驿站雨棚照明免布线控制方案
  • STM32F407嵌入式开发实战:从Cortex-M4内核到以太网通信全解析
  • 告别游戏限制!3步解锁Wand-Enhancer专业功能完整体验
  • 全球DC/RF探针台市场前景调研分析及投资建议研究报告2026年版
  • GEZHI(格致):面向社科研究的智能体架构
  • 信息系统的五大组成要素
  • 观察五年,铝艺大门的几个真实现状
  • SIOC测试是什么?亚马逊6A测试卖家必看的包装闯关全解
  • 如何快速掌握Akagi:你的智能麻将AI教练从入门到精通完整指南
  • 【单片机毕业设计推荐】基于 STM32/51 单片机的智能坐姿矫正护眼补光系统设计与实现 基于 STM32/51 单片机的人体感应智能台灯监测控制系统设计(021304)
  • 语雀文档批量导出终极方案:一键迁移你的技术资产
  • 假面骑士诺克斯驱动器:形态切换与音效灯光玩法全解析
  • gogin ErrorMiddleware的使用错误
  • tri-state(三态)介绍(状态设计模式,一个值或结果可以有三种明确的状态:成功(Success)、失败(Failure)、进行中/未知/未完成(Pending/Unknown))
  • WSA-Windows-10完整指南:在Windows 10上部署Android子系统的深度解析与实战教程