ElasticSearch搜索时term大写搜不到而match大小写都可以搜到的问题

ElasticSearch 字段数据存在,term查询不到指定的数据 阅读详情

1.最近在使用spring-data-elasticsearch时碰到一个问题,当查询字段是字符串时,并且传入的子串带有大写字母,这时候使用term精确查询无论字段类型是keyword还是text都是查询不到结果的,但是使用match却可以查到结果

2.各方查找资料得知乃是elasticsearch在创建倒排索引时,就已经将大写转为小写,而后写入索引;

    ES的建立索引过程:分词->语法处理(还原时态等等)->排序->创建索引。

3.目前有两种解决办法相对比较方便处理:

一种是在传入查询条件的时候,使用toLowerCase()转化为小写,但是条件一多,代码量颇多,不太适用。一种是在设置mapping的时候设置normalizer

如果创建index时mapping没有指定某个filed的标准化配置normalizer,那么如果写入ES的是大写,搜索出来看到的结果也是大写,但是创建的索引却是小写(可以用分词验证),以至于搜索的时候使用term会失败。

比如我的mapping为(内部使用,非完整mapping,重要是看字段):

  1. "mappings": {

  2. "rack_crm_community_type": {

  3. "dynamic": "false",

  4. "_all": {

  5. "enabled": false

  6. },

  7. "properties": {

  8. "claimBdPin": {

  9. "type": "string"

  10. },

  11. "createBdPin": {

  12. "type": "string"

  13. },

  14. "city": {

  15. "type": "integer"

  16. },

  17. "communityStatusCode": {

  18. "type": "integer"

  19. },

  20. "communityName": {

  21. "analyzer": "ik_max_word",

  22. "type": "string"

  23. },

  24. "location": {

  25. "type": "geo_point"

  26. },

  27. "communityId": {

  28. "type": "long"

  29. },

  30. "communityPersonNum": {

  31. "type": "integer"

  32. },

  33. "claimTime": {

  34. "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",

  35. "type": "date"

  36. }

  37. }

  38. }

  39. }

 以"claimBdPin"字段为例,只是指定了String类型。存储结果为:

当搜索条件为:

  1. {

  2. "query":{

  3. "bool":{

  4. "filter":[

  5. {"term": {"claimBdPin":"KA_liulin"}}

  6. ]

  7. }

  8. }

  9. }

结果为空。

当搜索条件为:

 
  1. {

  2. "query":{

  3. "bool":{

  4. "must":[

  5. {"match": {"claimBdPin":"KA_liulin"}}

  6. ]

  7. }

  8. }

  9. }

结果为:

能查询到,为什么呢?测试分词(ik_max_word)发现:KA_liulin分词为ka_liulin、ka、liulin三个分词。虽然存储的是KA_liulin,但是因为建立索引的时候会自动进行处理为ka_liulin(因为mapping未做分词),再创建索引。match查询的时候,会自动对参数进行处理,所以match搜索的时候使用KA_liulin(实际搜索为ka_liulin)能查询到,而term则查询不到。

因为mapping时未设置分词,所以一般使用term(过滤)来查询,所以要么在代码里面使用String.toLowerCase,但是太麻烦,那么要怎么一次性解决问题呢?我们可以mapping的时候设置normalizer(normalizer用于解析前的标准化配置,比如把所有的字符转化为小写等)

https://www.elastic.co/guide/en/elasticsearch/reference/6.1/normalizer.html

  1. PUT index

  2. {

  3. "settings": {

  4. "analysis": {

  5. "normalizer": {

  6. "my_normalizer": {

  7. "type": "custom",

  8. "char_filter": [],

  9. "filter": ["lowercase", "asciifolding"]

  10. }

  11. }

  12. }

  13. },

  14. "mappings": {

  15. "type": {

  16. "properties": {

  17. "foo": {

  18. "type": "keyword",

  19. "normalizer": "my_normalizer"

  20. }

  21. }

  22. }

  23. }

  24. }

ElasticSearch查询时term和match分词与否而导致的大小写问题 环境:ElasticSearch6.5.4版本,kibana6.5.4版本 首先在kibana的Dev Tools中插入几条数据,未制定mapping,则会默认动态映射 POST /stulib/items/_bulk {"index": {"_id": 1}} {"age": 11,"stuID": "STUID10010"} {"index": {"_id": 2}} {"age": 1... 阅读详情

相关推荐

Elasticsearch 中的 term、terms 和 match 查询

在 Elasticsearch 中,term、terms 和 match 查询是基础的搜索操作,它们分别适用于不同的场景。term 和 terms 用于精确匹配,而 match 用于全文搜索。了解它们的差异和适用情况对于构建有效的搜索查询至关重要。

龙大的博客 3576

Elasticsearch根据逗号查询时,查询不出大写字母问题

Elasticsearch根据逗号查询时,查询不出大写字母问题 项目上,使用的自定义分词,用的逗号分隔",",然后用的小写字母进行查询 "analysis": { "analyzer": { `在这里插入代码片` "comma": { "type": "pattern", "pattern":"," } }, "normalizer": {

weixin_37017316的博客 1213

ElasticSearch term和match查询机制解析和隐藏的查询问题

2. 关于默认分析使用term查询的问题 之前说过es的默认分析器会讲中文拆分成一个个的单个汉子,搜索条件“内科”会被分析为“内”和“科”,从而进行搜索。而对于搜索我们常用的match搜索类似于数据库的模糊查询,term搜索为精确查询。使用的时候会出现以下情况: 2.1 场景 默认不对索引下的字段进行mapping操作时,使用的是默认分析器,假设有如下数据内容: 内科 内一科 内...

Time_Travel的博客 4335

ElasticSearch 使用term查询无法匹配具有大小写的数据

因为对ElasticSearch不是很熟悉,所以在用的时候碰到了很多的坑。比如这次在使用term查询的时候,因为查询的数据中是大小写都有的,但是没有查询到数据,但是换成match查询就可以。 所以去查阅了一些资料,ElasticSearch在倒排索引的时候就会将大写全部转化为小写,但是match查询会分词,所以能匹配。但是term查询没有分析器,所以只能精准匹配,因此会没有结果返回。 解决的方法有...

zheyuan_xing的博客 2059

Docker网络冲突?手把手教你解决Dify社区版无法访问172.18.0.0网段的问题

本文详细解析了在部署Dify社区版时,因Docker默认网段与局域网冲突导致无法访问172.18.0.0网段的问题。通过剖析Docker网络原理,提供了修改Docker守护进程默认地址池的根治方案,并介绍了在Compose文件中指定自定义网络等备选方法,帮助用户彻底解决网络冲突,保障服务稳定运行。

p8q9r0的博客 484

DLMS—Cryptographic algorithms—(Green-Book)加密算法

密码学是数学的一个分支,基于数据的转换,并且可以用来提供多种安全服务:保密性、数据完整性、认证、授权和不可否认性。密码学依赖于两个基本组成部分:算法(或密码学方法)和密钥。算法是一个数学函数,而密钥是在转换过程中使用的参数。密码算法和密钥用于对数据应用密码保护(例如,加密数据或生成数字签名),以及移除或检查保护(例如,解密加密的数据或验证数字签名)。密码哈希函数:这类函数不需要密钥(尽管它们可以以使用密钥的模式使用)。哈希函数通常用作算法的一个组成部分,以提供安全服务。见9.2.3.2节。对称密钥算法。

一个bug是bug,多个bug能work 1708

ES使用过程中的一些问题

问题1 描述:资产编码“01FIRSTsec012017051510110”,加上FieldIndex.not_analyzed注解后,资产搜索(“FIRSTsec01”)搜不到字母与数字的模糊组合,使用analyzer = ""注解后可以搜索到 代码段: //搜索不到 @Field(type = FieldType.String, index = FieldIndex.no...

sinat_30071601的博客 639

无人机芯片模块技术要点分析

恶劣环境下信号稳定性:无人机在恶劣环境下工作时,遥感系统采集的信号往往很不稳定,视频信号处理芯片需要具备强抗干扰能力,能辨别脉冲脉宽为50ns以上、幅度为0V~4.5V的输入信号。这种架构能兼顾强大的运算能力和灵活的接口控制。芯片小型化:麻省理工学院的研究人员已设计出仅20平方毫米的微型芯片,可处理无人机飞行所需的惯性数据和相机图像,为微型无人机的发展奠定了基础。光子集成芯片(PIC) :研究显示,与电子芯片相比,光子计算芯片在延迟、计算容量和能效上都有数量级的提升,有望解决当前无人机系统的计算瓶颈。

YUNZHUO666的博客 1404

ElasticSearch全文搜索引擎之term和match的区别

一、简介 在elasticsearch中,查询主要使用到两个:term和match,本篇文章将总结一下两者的区别。 term:代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词解析,直接对关键词进行查找; match:代表模糊匹配,搜索前会对搜索词进行分词解析,然后按分词匹配查找; 一般模糊查找的时候,多用match,而精确查找时可以使用term。 二、term精确匹配 term查询是直接通过倒排索引指定的词条进行查找的。 首先创建一个索引member,并插入几条测试数据,相关命

weixiaohuai的博客 1万+

NVIDIA DGX Spark实战:如何在桌面上轻松运行200B参数大模型?

本文详细介绍了如何利用NVIDIA DGX Spark在桌面端轻松运行200B参数大模型。通过实战演示,从系统初始化、模型获取部署到内存管理与性能调优,重点解析了其统一内存架构如何解决本地推理的显存瓶颈,并探讨了进行轻量化微调(如LoRA)的可能性,为AI开发者和研究团队提供了高效的本地化大模型操作方案。

weixin_29054195的博客 882

第二次 PX4仿真环境搭建过程全记录

参考链接 https://blog.youkuaiyun.com/yanwumuxi/article/details/80097294 https://www.ncnynl.com/archives/201709/2013.html 一、安装依赖项 我们使用Debian / Ubuntu LTS 作为Linux的标准支持版本,但是也支持Cent OS 和 Arch Linux的发行版本。 权限设置 警告:永远...

移步换景的博客 2262

【Elasticsearch】全文搜索与精确匹配:match与term查询

在使用Elasticsearch进行数据检索时,开发者常常会面临一个关键问题:如何选择合适的查询方式来满足不同的搜索需求?在众多查询类型中,match和term查询是最基础、最常用的两种,但它们的适用场景和行为机制却大相径庭。理解它们之间的区别,是掌握Elasticsearch高效检索能力的第一步。本文将深入探讨match与term查询的核心原理、使用场景、性能差异以及常见误区,帮助你根据实际需求做出正确的选择。

屿小夏.的知识博客 3222

如何在非序列模式下使用类似图像模功能

如何在非序列模式下使用类似图像模功能

weixin_72050316的博客 552

ES term之大小写

ES term之大小写问题解决问题重现问题查看mapping映射以及_analyze API测试定位问题结论 如果不想看啰嗦的事由可以直接跳到结论 问题 同事说ES搜索,有些能搜索到,而有些确定是有数据的但是无法搜索出来。 解决问题 重现问题 向同事要了所要搜索的索引 和 字段以及搜索参数,验证下同事使用姿势是否正确。结果果然如同事所说,问题重现,无法匹配。 查看mapping映射以及_analyze API测试 发现这个字段是一个type为text 分词方式为 自定义正则分词器以“,”(逗号)分割。 使用

强强强子的博客 2515

【DRAM存储器二】Sense Amplifier

详述DRAM颗粒中感应放大器功能、电路结构、工作原理和操作波形

highman110的博客 7199

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ElasticSearch 字段数据存在,但用term查询搜索不到指定的数据

近日使用ElasticSearch查询数据时遇到了个问题,在es中该字段对应的数据是存在的,但使用term/terms查询时却查不到。 同时,我使用match去查询却能查到: match能查到而term查不到,用过es的都应知道这两者的查询是有区别的:match是全文搜索,用于查询字段类型为text的字段,match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配;而term是精确查询,也就是完全匹配,通常用于对keyword和有精确值的字段进行查询,搜索前不会再对搜索词进行分词拆解。 由上面的.

Tony_zt的博客 8998

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

再谈Elasticsearch全文搜索:你不知道的query_string、match、term、match_phrase的区别

再谈Elasticsearch全文搜索:你不知道的query_string、match、term、match_phrase的区别match和term区别1.term查询keyword字段2.term查询text字段3.match查询keyword字段4.match查询text字段match_phrase和query_string的区别1.match_phrase查询keyword字段2.match...

静幽水 5673

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Elasticsearch 查询之term,match,match_phrase

1. term查询是基于词项的查询,而且当设置为term查询时,es不会对这个词做任何处理,但是在文本进行分词时,通常都会将大写转为小写,这个时候就会出现查不出来的情况,比如: POST /test/_doc { "name":"Pantheon" } 这样创建出来的doc可以看到明显做了lowercase,因为用的standard分词器 GET /test/_analyze { "field": "name", "text": "Pantheon" } 所以当使用下面的语句去查

zhanggf的博客 2780

es中match_phrase和term区别

我们知道,match会对输入进行分词处理后再去查询。 但是match_phrase和term都是不分词的精确查询,这二者有什么区别呢? 【发现问题】 1.我们先放入一个文档: 2.然后使用match_phrase搜索: 嗯,不出所料,搜索到了。 3.然后我们用term试试 纳尼!!!居然没有?那么全句带进去搜总行了吧 居然还是不行!!这就奇怪了。 【问题分析】我们来看看这句话的分词结...

timothytt的博客 2万+

es笔记三之term,match,match_phrase 等查询方法介绍

首先介绍一下在 es 里有两种存储字符串的字段类型,一个是 keyword,一个是 text。keyword 在存储数据的时候是作为一个整体存储的,不会对其进行分词处理text 存储数据的时候会对字符串进行分词处理,然后存储。而对于查询方法, term 是精确查询,match 是模糊查询。接下来我们用几个例子,来分别表达下这两种类型的字段,使用 term,match,match_phrase 等搜索的情况。

weixin_43354181的博客 9727

ES中match和term差别对比

match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,而term会直接对关键词进行查找。一般模糊查找的时候,多用match,而精确查找时可以使用term。举个例子说明一下:{ "match": { "title": "my cat"} }{ "bool": { "should": [ { "term": { "tit

张胜楠的博客 4万+

ElasticSearch term查询搜索不到指定的数据

问题现象:match可以搜索到数据而term搜索不到,相同的搜索条件。 问题分析: 1.首先想到的是两者的区别 match 和term区别如下: match:全文搜索, 通常用于对text类型字段的查询,会对进行查询的文本先进行分词操作 term:精确查询,通常用于对keyword和有精确值的字段进行查询,不会对进行查询的文本进行分词操作 2.由于其区别如上,所以去查看索引的mapping文件,发现我们要找的字段设置如下:默认为text,fields表示对一个字段设置多种索引模式,同一个

Always on the road 7539

【ES】match与term的区别

match与term的区别term 用法match 用法match_phrase 用法 本文转载自:https://www.cnblogs.com/natee/p/ES.html,作者写的已经很好,拿来作为笔记。 term 用法 先看看 term 的定义,term 是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。 这里通过例子来说明,先存放一些数据: { "title": "love China", "content": "people very love China"

weixin_42926863的博客 2901

elasticsearch搜索引擎的常用方法(二) term和terms,match,range,sort等

1、term和terms term和terms等查询,不会对查询对字段进行分词处理,适合于date、num、id等确切数据进行搜索 如果需要查询keywords,则查询等keywords必须是查询字段中可以分出来的词,如果不是,则无法查询到数据。 例如:age字段包含的值为80后、90后。使用term查询,{"term":{"age":"80后"}} 这样是无法查询到age是"80后"的数据...

程序猿的修炼之路 5797
上一篇: elasticsearch的indexId长度超过512字节报错 id is too long, must be no longer than 512 bytes but was: 538
下一篇: springboot启eureka时:Cannot find template location(s): [classpath:/templates/]
qq_34412985
博客等级 码龄11年 143粉丝 983原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值