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

es搜索实现既能模糊查询又能分词查询

现在有一个es的字段,希望它既能分词查询,又能有模糊查询怎么办?
只有分词查询的坏处:
可能单个字反而搜不出来,比如一个“南京”,搜“南”字就搜不出来,反而降低体验。
想让es既能分词又能模糊查询有几种办法:

方案一:利用 keyword 子字段实现精确与模糊搜索并存

实现原理

通过为 name 字段添加 keyword 子字段,使其既能进行分词搜索(利用 name 字段自身),又能实现精确或模糊搜索(借助 name.keyword 子字段)。
具体操作步骤

重新定义索引映射

PUT /ebox_material_bizitem/_mapping
{"properties": {"name": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}
}

搜索:

GET /ebox_material_bizitem/_search
{"query": {"bool": {"should": [{ "match": { "name": "四" } },          // 分词搜索(如:匹配"四川"、"四季"){ "wildcard": { "name.keyword": "*四*" } }  // 模糊搜索(需完整包含"四")],"minimum_should_match": 1}}
}

代码:

nameQuery := elastic.NewBoolQuery().Should(elastic.NewMatchQuery("name", req.GetName()),          // 分词搜索elastic.NewWildcardQuery("name.keyword", "*"+req.GetName()+"*"),  // 模糊搜索).MinimumNumberShouldMatch(1)queryArgs = append(queryArgs, es.WithMust(nameQuery))

方案二:运用自定义分词器实现多粒度分词

实现原理

创建一个自定义分词器,将文本同时分词为单字和词语,从而兼顾模糊搜索和分词搜索的需求。

方案三:结合 match 和 wildcard 查询

实现原理

在同一个查询中同时使用 match 查询(用于分词搜索)和 wildcard 查询(用于模糊搜索),然后通过 bool.should 将它们组合起来。

GET /ebox_material_bizitem/_search
{"query": {"bool": {"should": [{"match": {"name": {"query": "四","boost": 2  // 提高分词搜索的权重}}},{"wildcard": {"name": {"value": "*四*","boost": 1  // 降低模糊搜索的权重}}}],"minimum_should_match": 1}}
}

用代码实现:

if req.GetName() != "" {nameQuery := elastic.NewBoolQuery().Should(elastic.NewMatchQuery("name", req.GetName()).Boost(2),            // 提高分词搜索权重elastic.NewWildcardQuery("name", "*"+req.GetName()+"*").Boost(1), // 降低模糊搜索权重).MinimumNumberShouldMatch(1)queryArgs = append(queryArgs, es.WithMust(nameQuery))}
http://www.dtcms.com/a/291794.html

相关文章:

  • [Dify] -进阶10- Dify 的用户输入结构:变量、参数、文件上传全解析
  • stm32 智能小车
  • 【多线程篇22】:ConcurrentHashMap的并发安全原理剖析
  • 低成本、高泛化能力的无人机自主飞行!VLM-Nav:基于单目视觉与视觉语言模型的无地图无人机导航
  • C++类和对象(3)
  • 从零搭建 OpenCV 项目(新手向)--第一天初识OpenCV与图像基础
  • MCP:Cline+DeepSeek在VSCode上配置
  • TDengine 计算百分位函数使用手册
  • .net web 中如何优雅地使用 redis?
  • MFC类Qt的自动布局框架
  • 景区负氧离子监测设备:守护清新,赋能旅游
  • 【kubernetes】-2 K8S的资源管理
  • 学习笔记-关于中华心法问答系统的环境配置和源代码理解
  • 基于Vue+ElementUI的借还款利息计算器
  • Java 动态导出 Word 登记表:多人员、分页、动态表格的最佳实践
  • SpringBoot集成PDFBox实现PDF导出(表格导出、分页页码、电子签章与数字签名)
  • RISC-V基金会Datacenter SIG月会圆满举办,探讨RAS、PMU性能分析实践和经验
  • Rust实战:决策树与随机森林实现
  • 【vscode】vscode中python虚拟环境的创建
  • 激光雷达-自动驾驶的“三维感知中枢“
  • IntelliJ IDEA (2024.3.1)优雅导入 Maven 项目的两种方式详解
  • 【Java企业级开发】(六)Java框架技术-Maven和MyBatis
  • Docker容器 介绍
  • Maven 环境配置全攻略:从入门到实战
  • Kafka灰度方案
  • 两个android,一个客户端一个服务器端
  • 【菜狗学聚类】时间序列聚类主要方法—20250722
  • zmaiFy来说软字幕和硬字幕有什么优缺点?
  • 【LINUX】CentOS Stream 9 手动配置网络
  • [hot 100]两数之和-Python3-Hash Table