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

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. }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值