【Elastic知识简报】normalizer与analyzer的区别

举报
wu@55555 发表于 2022/11/19 17:34:10 2022/11/19
【摘要】 1、区别normalizer与analyzer的作用类似,都是对字段进行处理,但是不同之处在于normalizer不会对字段进行分词,也就是说normalizer没有tokenizer。所以normalizer是作用于keyword类型的字段的,相当于我们需要给keyword类型字段做一个额外的处理时,比如转换为小写时就可以用到normalizer 2、除了keyword类型,其他类型字段...

1、区别

normalizer与analyzer的作用类似,都是对字段进行处理,但是不同之处在于normalizer不会对字段进行分词,也就是说normalizer没有tokenizer。

所以normalizer是作用于keyword类型的字段的,相当于我们需要给keyword类型字段做一个额外的处理时,比如转换为小写时就可以用到normalizer

2、除了keyword类型,其他类型字段能设置normalizer吗?

不能

3、给keyword类型字段设置了analyzer,该字段会分词吗?

不会,实际上keyword类型是不能设置analyzer的,该类型下没有这个属性,强行设置会直接报错

4、normalizer也会作用到查询词上

当查询设置了normalizer属性的keyword类型字段时,其normalizer也会作用到查询词上

下面我们通过一个实验来证明这一点,同时也通过这个设置来体会normalizer与analyzer用法上的互通性:
设置mappings

PUT test1
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "my_analyzer", 
        "fields": {
          "keyword": {
            "type": "keyword",
            "normalizer": "my_normalizer"
          }
        }
      },
      "title": {
        "type": "text",
        "analyzer": "standard",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "filter": ["lowercase"],
          "char_filter": []
        }
      },
      "analyzer": {
        "my_analyzer": {
          "filter":  ["lowercase"],
          "tokenizer": "standard"
        }
      }
    }
  }
}

插入数据

POST test1/_bulk
{"index":{}}
{"name": "THIS is GOOD NEWS","title":"GOOD NEWS"}
{"index":{}}
{"name": "this is good news","title":"good news"}

查询

GET test1/_search
{
  "query": {
    "match": {
      "name.keyword": "THIS IS GOOD NEWS"
    }
  }
}

执行结果:
会发现将两条数据都查询出来了,因为我们在name.keyword上设置了normalizer(转换小写),源数据中的name.keyword数据被转换为了小写,同时查询词也会被转换为小写,所有都为小写时自然将结果查询出来了

"hits" : [
      {
        "_index" : "test1",
        "_type" : "_doc",
        "_id" : "--IF9n0BcmNQdWdLpMWX",
        "_score" : 0.18232156,
        "_source" : {
          "name" : "THIS is GOOD NEWS",
          "title" : "GOOD NEWS"
        }
      },
      {
        "_index" : "test1",
        "_type" : "_doc",
        "_id" : "_OIF9n0BcmNQdWdLpMWX",
        "_score" : 0.18232156,
        "_source" : {
          "name" : "this is good news",
          "title" : "good news"
        }
      }
    ]
  }

查询2

GET test1/_search
{
  "query": {
    "match": {
      "title.keyword": "good news"
    }
  }
}

结果:
在title.keyword上没有设置normalizer,所以只能查询到小写的结果

"hits" : [
      {
        "_index" : "test1",
        "_type" : "_doc",
        "_id" : "_OIF9n0BcmNQdWdLpMWX",
        "_score" : 0.6931471,
        "_source" : {
          "name" : "this is good news",
          "title" : "good news"
        }
      }
    ]
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。