elasticsearch 实现查询忽略大小写

打印 上一主题 下一主题

主题 681|帖子 681|积分 2047

背景:在搜索的时候经常会有一种场景就是忽略大小写,不管你输入的是全大写还是全小写还是大小写混合,希望都能够搜索出结果。
解决思路:Elasticsearch中的lowercase normalizer将文本转换为小写,并将其作为规范形式存储在索引中。这可以确保在搜索和比较文本时忽略大写字母的差异,从而提高搜索的准确性和一致性
实现方案:
开发过程中,经常会遇到索引是之前已经建好的,由于es的规则,只能新增字段,不能删除或者修改已经存在的字段,可以动态更新原有索引的setting,动态更新setting,需要先关闭索引,执行玩更新操作以后,再开启索引,步骤如下:
index_name是 索引名称
field_name是字段名称
  1. POST index_name/_close
  2. PUT /index_name/_settings
  3. {
  4.   "index":{
  5.     "analysis":{
  6.       "normalizer":{
  7.         "lowercase_normalizer":{
  8.           "type": "custom",
  9.           "char_filter": [],
  10.            "filter": ["lowercase"]
  11.         }
  12.       }
  13.     }
  14.   }
  15. }
  16. POST index_name/_open
  17. PUT /index_name/_mapping
  18. {
  19.     "properties" : {
  20.       "field_name" : {
  21.         "type" : "keyword",
  22.         "normalizer":"lowercase_normalizer"
  23.       }
  24.     }
  25. }
复制代码
 举个例子:
新建一个索引:
  1. PUT /lowercase_normalizer_index
  2. {
  3.     "mappings" : {
  4.       "properties" : {
  5.         "id" : {
  6.           "type" : "keyword"
  7.         }
  8.       }
  9.     }
  10. }
复制代码
新增字段 设置属性
  1. POST lowercase_normalizer_index/_close
  2. PUT /lowercase_normalizer_index/_settings
  3. {
  4.   "index":{
  5.     "analysis":{
  6.       "normalizer":{
  7.         "lowercase_normalizer":{
  8.           "type": "custom",
  9.           "char_filter": [],
  10.            "filter": ["lowercase"]
  11.         }
  12.       }
  13.     }
  14.   }
  15. }
  16. POST lowercase_normalizer_index/_open
  17. PUT /lowercase_normalizer_index/_mapping
  18. {
  19.     "properties" : {
  20.       "name" : {
  21.         "type" : "keyword",
  22.         "normalizer":"lowercase_normalizer"
  23.       }
  24.     }
  25. }
复制代码
 
插入一些数据
  1. PUT lowercase_normalizer_index/_doc/1
  2. {
  3.   "id": "1",
  4.   "name": "Mohammed Ahmed"
  5. }
复制代码
  1. PUT lowercase_normalizer_index/_doc/2
  2. {
  3. "id": "2",
  4. "name": "Sophie Martin"
  5. }
复制代码
  1. PUT lowercase_normalizer_index/_doc/3
  2. {
  3.   "id": "3",
  4.   "name": "mohammed ahmed"
  5. }
复制代码
 验证
  1. GET lowercase_normalizer_index/_search
  2. {
  3.   "query": {
  4.     "wildcard": {
  5.       "name": {
  6.         "value": "*moham*"
  7.       }
  8.     }
  9.   }
  10. }
复制代码
结果
  1. {
  2.   "took" : 1,
  3.   "timed_out" : false,
  4.   "_shards" : {
  5.     "total" : 1,
  6.     "successful" : 1,
  7.     "skipped" : 0,
  8.     "failed" : 0
  9.   },
  10.   "hits" : {
  11.     "total" : {
  12.       "value" : 2,
  13.       "relation" : "eq"
  14.     },
  15.     "max_score" : 1.0,
  16.     "hits" : [
  17.       {
  18.         "_index" : "lowercase_normalizer_index",
  19.         "_type" : "_doc",
  20.         "_id" : "1",
  21.         "_score" : 1.0,
  22.         "_source" : {
  23.           "id" : "1",
  24.           "name" : "Mohammed Ahmed"
  25.         }
  26.       },
  27.       {
  28.         "_index" : "lowercase_normalizer_index",
  29.         "_type" : "_doc",
  30.         "_id" : "3",
  31.         "_score" : 1.0,
  32.         "_source" : {
  33.           "id" : "3",
  34.           "name" : "mohammed ahmed"
  35.         }
  36.       }
  37.     ]
  38.   }
  39. }
复制代码
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表