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

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.xdnf.cn/news/15969.html

相关文章:

  • Linux部署.net Core 环境
  • 8.4 Java 原生 TCP Socket 实现 HTTP 请求解析和请求分发
  • Dify接入MCP案例1:基于Chatflow旅行、吃饭、新闻、学习的AI智能体
  • 公司内部网址怎么在外网打开?如何让外网访问内网的网站呢?
  • 2025 年非关系型数据库全面指南:类型、优势
  • cddlib(用于凸多面体计算和线性不等式系统求解)的开源库
  • JAVA API (三):从基础爬虫构建到带条件数据提取 —— 详解 URL、正则与爬取策略
  • Java 大视界 -- Java 大数据在智能交通自动驾驶车辆与周边环境信息融合与决策中的应用(357)
  • JMeter 实现 Protobuf 加密解密
  • UE5 UI 水平框
  • ansible 批量 scp 和 load 镜像
  • MybatisPlus-16.扩展功能-枚举处理器
  • Windows PE文件内未用空间学习
  • DNS应用层协议
  • Linux驱动-中断-共享队列
  • 两个android,一个客户端一个服务器端
  • 2025.7.22 测试 总结
  • Web服务器(Tomcat、项目部署)
  • C# 中的装箱与拆箱
  • 今日行情明日机会——20250722
  • 基于AutoJawSegment项目的CBCT图像分割实践指南
  • 【bug】Yolo11在使用tensorrt推理numpy报错
  • Java 中 String 类的常用方法
  • OneCode 3.0 @TreeAnnotation及@ChildTreeAnnotation子树注解速查手册
  • 生存分析机器学习问题
  • 数据交换---JSON格式
  • IDEA-通过IDEA导入第三方的依赖包
  • Android常用的adb和logcat命令
  • Qt/C++源码/监控设备模拟器/支持onvif和gb28181/多路批量模拟/虚拟监控摄像头
  • RedisJSON 指令精讲JSON.TOGGLE 键翻转布尔值