ES模糊查询不区分大写
创始人
2024-11-10 14:08:39
0

一、 概述

最近接到新任务,产品说名称能支持模糊搜索,且不区分大小写。
以为是数据库操作,那岂不是easy,分分钟的事情,往往事情觉得简单的时候就不简单了,脑子忽然闪现想起该模块数据是放在ES里的,ES模糊查询不分大小写???ES新手小白两眼抹黑,待我调研调研>>>>>

一顿操作ES海洋里遨游一圈~~~终于找到了,首先了解到
ES5.x以上版本使用text和keyword作为字符串类型取代之前版本的string类型。

  • 字符串 - text:用于全文索引,该类型的字段将通过分词器进行分词,最终用于构建索引
  • 字符串 - keyword:不分词,只能搜索该字段的完整的值,只用于 filtering

两者实现方式略微不同,实质本质一样都是使用分析器。注意ES中的字段是什么类型的。

ES里提供了很多分析器,可以上官网看看,这样就会明白为什么这么做了,这里不多解释,ES的text analyer。

二、 keyword类型模糊查询不区分大小写

官方给出了一个解决方案,使用normalizer来解决,normalizer是keyword的一个属性,可以对keyword生成的单一term,query_string做进一步的处理。修改setting,需要先关闭索引,修改后再打开索引,防止数据丢失.

  1. settings添加分析器
# 关闭索引 ​POST test_index/_close    PUT test_index/_settings {     "analysis": {       "normalizer": {         "lowercase_normalizer": {           "type": "custom",           "char_filter": [],           "filter": [             "lowercase"           ]         }       }     } }  #打开索引  POST test_index/_open  # 查看settings看是否加上 lowercase_normalizer GET test_index/_settings  
  1. 添加新字段且设置分析器
    这里选择的是新的字段
​PUT test_index/station/_mapping {   "properties": {     "querName": {       "type": "keyword",       "normalizer": "lowercase_normalizer"     }   } }  # 查看新的mapping GET test_index/_mapping   # 同步数据: 把原来的字段值同步到新字段 POST test_index/_update_by_query {   "script": {     "lang": "painless",     "source": "if (ctx._source.queryName== null) {ctx._source.queryName= ctx._source.name.toLowerCase()}"   } }  

三、text类型模糊查询不区分大小写

text类型的需要写一个分析器,然后添加到text类型字段上

--- 关闭索引 POST test_index/_close  --- 新增按小写查询分析器 PUT test_index/_settings {  "analysis" : {           "analyzer" : {             "ngram-analyzer" : {               "type" : "custom",               "tokenizer" : "ngram_tokenizer"             },             "ngram-lowercase" : {               "type" : "custom",               "tokenizer" : "ngram_tokenizer",               "filter":"lowercase"             }           }         } }    --- 打开索引 POST test_index/_open  --- 新增queryName字段,支持不区分大小写查询,且设置查询分析器 PUT  test_index/_mapping {   "properties": {     "queryName": {       "type": "text",       "analyzer" : "ngram-analyzer",       "search_analyzer":"ngram-lowercase"     }   } }  --- 处理历史数据queryName值为name的值 POST test_index/_update_by_query {   "script": {     "lang": "painless",     "source": "if (ctx._source.queryName== null) {ctx._source.queryName= ctx._source.name.toLowerCase()}"   } } 

你以为到这里就成功了????我也这么以为,但是高兴太早了,因为我发现ES的数据里有大写字母时,忽略大小写功能不全好使,百思不得其解,why???。

例如:ES的 [{"queryName":"TEst1"},{"queryName":"TEST2"},{"queryName":"tesst3"}]  查询条件为"TEST"或"test"或"Test" 期望是查询出来三条,但是大写的查询不出来; 

但是我把ES的queryName都转化为小写的,嘿嘿嘿~~~~,模糊查询忽略大小写好使了,这里我也不是很清楚,待调研ing ,若是有知道的可以交流交流。
queryName.toLowerCase();

例如:ES的 [{"queryName":"test1"},{"queryName":"test2"},{"queryName":"test3"}]  查询条件为"TEST"或"test"或"Test" 期望是查询出来三条, 实际查询也是三条; GET test_index/_search {"query": {   "bool": {     "must": [          {         "match_phrase" : {           "queryName" : {             "query" : "Test"           }         }       }     ]   } }} 

相关内容

热门资讯

透视辅助(德州aapoker俱... 透视辅助(德州aapoker俱乐部)aapoker辅助工具存在(透视)果然是真的有挂(详细辅助解密教...
透视美元局!智星德州菠萝偷偷看... 透视美元局!智星德州菠萝偷偷看牌功能,(德州wepower)都是是有挂(详细辅助大神讲解)1、进入到...
透视插件(AAPOKEr)aa... 透视插件(AAPOKEr)aapoker发牌机制(透视)好像真的是有挂(详细辅助wpk教程)1、玩家...
透视好牌!德扑之星辅助器购买,... 透视好牌!德扑之星辅助器购买,(德州nzt)都是是真的有挂(详细辅助攻略方法)1、全新机制【德扑之星...
透视安卓版(aapoKER)a... 透视安卓版(aapoKER)aapoker有挂(透视)总是是真的有挂(详细辅助解密教程)1、很好的工...
透视安装!德州ai辅助,(云扑... 透视安装!德州ai辅助,(云扑克德州)都是存在有挂(详细辅助揭秘攻略);德州ai辅助辅助器中分为三种...
透视私人局(AApoker)a... 透视私人局(AApoker)aapoker猫腻(透视)原来存在有挂(详细辅助2025版教程);1、每...
透视安装!德州之星辅助,(德州... 透视安装!德州之星辅助,(德州ai)原来真的有挂(详细辅助攻略方法)1、游戏颠覆性的策略玩法,独创攻...
透视科技(AApoker)aa... 透视科技(AApoker)aapoker挂(透视)确实是有挂(详细辅助教你攻略);1、aapoker...
透视挂透视!智星德州菠萝外挂,... 透视挂透视!智星德州菠萝外挂,(德州俱乐部)竟然真的是有挂(详细辅助扑克教程);透视挂透视!智星德州...