当前位置:   article > 正文

elasticsearch 设置term 以及keyword查询忽略大小写_es查询不区分大小写

es查询不区分大小写

Elasticsearch 中处理字符串类型的数据时,如果我们想把整个数据作为一个完整的 term 存储,我们通常会将其类型( type) 设定为 keyword。而这种设定又会给我们带来麻烦,比如 Bar、bar两个实际都是 bar,但当我们去搜索 bar时却无法返回 Bar的文档。要解决这个问题,就需要 Normalizer出场了!

 
PUT test_normalizer
{
  "mappings": {
    "properties": {
        "foo":{
          "type":"keyword"
        }
      }
  }
}
 
PUT test_normalizer/_doc/1
{
  "foo":"bar"
}
 
PUT test_normalizer/_doc/2
{
  "foo":"Bar"
}
 
 
# 查询一 
GET test_normalizer/_search
{
  "query": {
    "match":{
      "foo":"bar"
    }
  }
}
 
# 查询二
GET test_normalizer/_search
{
  "query": {
    "match":{
      "foo":"BAr"
    }
  }
}
# 查询三
GET test_normalizer/_search
{
  "query": {
    "term":{
      "foo":"baR"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

结果:

查询一:返回 id=1的数据

查询二、查询三:查询不到数据

原因:

  1. 写入 Elasticsearch时由于字段的 type是 keyword,分词结果为原始字符串(type=string时,是转为小写创建索引的)

  2. 查询 Query 时分词默认是采用和字段写时相同的配置,因此这里也就是 keyword,这查就是直接把内容去匹配了;从而查询一可以匹配到数据,查询二、三查询不到数据;

  3. 注意:term是代表完全匹配,即查询的关键词不会被分词处理;

normalizer解决方案

 
DELETE test_normalizer
# 自定义 normalizer
 
PUT test_normalizer
{
  "settings": {
    "analysis": {
      "normalizer": {
        "lowercase": {
          "type": "custom",
          "filter": ["lowercase"]
        }
      }
    }
  },
  "mappings": {
      "properties": {
        "foo": {
          "type": "keyword"
        },
        "foo_normalizer": {
          "type": "keyword",
          "normalizer": "lowercase"
        }
    }
  }
}
 
PUT test_normalizer/_doc/1
{
  "foo": "bar",
  "foo_normalizer": "bar"
}
PUT test_normalizer/_doc/2
{
  "foo": "Bar",
  "foo_normalizer": "Bar"
}
 
# 查询三
GET test_normalizer/_search
{
  "query": {
    "term":{
      "foo":"BaR"
    }
  }
}
# 查询四
GET test_normalizer/_search
{
  "query": {
    "term":{
      "foo_normalizer":"bAr"
    }
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  1. normalizer是 keyword的一个属性,可以对 keyword生成的单一 Term再做进一步的处理,比如 lowercase,即做小写变换。使用方法和自定义分词器有些类似。

  2. 我们第一步是自定义了名为 lowercase的 normalizer,其中filter 类似自定义分词器中的 filter ,normalizer中可可用的filtr种类很少,详情大家可以查看官方文档。

  3. 通过 normalizer属性设定到指定字段type_normalizer中;

  4. 然后插入相同的2条文档。执行发现,查询三无结果返回,查询四返回2条文档。

流程说明:

es文档写入时由于对字段指定了 normalizer,那该字段的 term都会被做小写处理

查询时搜索词同样采用有 normalizer的配置,因此处理后的 term也是小写的

这样写入数据和搜索都忽略大小写,就得到了我们上面的结果

https://www.elastic.co/guide/en/elasticsearch/reference/current/normalizer.html#:~:text=The%20normalizer%20is%20applied%20prior%20to%20indexing%20the,lowercase%20ships%20with%20elasticsearch%20and%20can%20be%20used.

https://discuss.elastic.co/t/prefix-query-insensitive-case-normalizer-or-analyzer-nest-inside/252255/2

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45979?site
推荐阅读
相关标签
  

闽ICP备14008679号