搜“apple”不返回“Apple”?你需要了解 Elasticsearch Normalizer

简介: 在 Elasticsearch 中处理字符串类型的数据时,如果我们想把整个字符串作为一个完整的 term 存储,我们通常会将其类型 type 设定为 keyword。但有时这种设定又会给我们带来麻烦,比如同一个数据再写入时由于没有做好清洗,导致大小写不一致,比如 apple、Apple 两个实际都是 apple,但当我们去搜索 apple 时却无法返回 Apple 的文档。要解决这个问题,就需要 Normalizer 出场了。

作者介绍

魏彬,普翔科技 CTO,开源软件爱好者,中国第一位 Elastic 认证工程师,《Elastic日报》和 《ElasticTalk》社区项目发起人,被 elastic 中国公司授予 2019 年度合作伙伴架构师特别贡献奖。对 Elasticsearch、Kibana、Beats、Logstash、Grafana 等开源软件有丰富的实践经验,为零售、金融、保险、证券、科技等众多行业的客户提供过咨询和培训服务,帮助客户在实际业务中找准开源软件的定位,实现从 0 到 1 的落地、从 1 到 N 的拓展,产生实际的业务价值。

在 Elasticsearch 中处理字符串类型的数据时,如果我们想把整个字符串作为一个完整的 term 存储,我们通常会将其类型 type 设定为 keyword。但有时这种设定又会给我们带来麻烦,比如同一个数据再写入时由于没有做好清洗,导致大小写不一致,比如 apple、Apple两个实际都是 apple,但当我们去搜索 apple 时却无法返回 Apple 的文档。要解决这个问题,就需要 Normalizer 出场了。废话不多说,直接上手看!

一、上手

我们先来重现一下开篇的问题。

PUT test_normalizer
{
  "mappings": {
    "doc":{
      "properties": {
        "type":{
          "type":"keyword"
        }
      }
    }
  }
}
PUT test_normalizer/doc/1
{
  "type":"apple"
}
PUT test_normalizer/doc/2
{
  "type":"Apple"
}
# 查询一 
GET test_normalizer/_search
{
  "query": {
    "match":{
      "type":"apple"
    }
  }
}
# 查询二
GET test_normalizer/_search
{
  "query": {
    "match":{
      "type":"aPple"
    }
  }
}

大家执行后会发现 查询一返回了文档1,而 查询二没有文档返回,原因如下图所示:

image.png

1、Docs写入 Elasticsearch时由于 type 是 keyword,分词结果为原始字符串
2、查询 Query 时分词默认是采用和字段写时相同的配置,因此这里也是 keyword,因此分词结果也是原始字符
3、两边的分词进行匹对,便得出了我们上面的结果

二、Normalizer

Normalizer 是 keyword 的一个属性,可以对 keyword 生成的单一 Term 再做进一步的处理,比如 lowercase,即做小写变换。使用方法和自定义分词器有些类似,需要自定义,如下所示:

DELETE test_normalizer
# 自定义 normalizer
PUT test_normalizer
{
  "settings": {
    "analysis": {
      "normalizer": {
        "lowercase": {
          "type": "custom",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "doc": {
      "properties": {
        "type": {
          "type": "keyword"
        },
        "type_normalizer": {
          "type": "keyword",
          "normalizer": "lowercase"
        }
      }
    }
  }
}
PUT test_normalizer/doc/1
{
  "type": "apple",
  "type_normalizer": "apple"
}
PUT test_normalizer/doc/2
{
  "type": "Apple",
  "type_normalizer": "Apple"
}
# 查询三
GET test_normalizer/_search
{
  "query": {
    "term":{
      "type":"aPple"
    }
  }
}
# 查询四
GET test_normalizer/_search
{
  "query": {
    "term":{
      "type_normalizer":"aPple"
    }
  }
}

我们第一步是自定义了名为 lowercase 的 normalizer,其中 filter 类似自定义分词器中的 filter ,但是可用的种类很少,详情大家可以查看官方文档。然后通过 normalizer属性设定到字段 type_normalizer 中,然后插入相同的 2 条文档。执行发现,查询三无结果返回,查询四返回 2 条文档。

问题解决了!我们来看下是如何解决的

image.png

1、文档写入时由于加入了 normalizer,所有的 term 都会被做小写处理
2、查询时搜索词同样采用有 normalizer 的配置,因此处理后的 term 也是小写的
3、两边分词匹对,就得到了我们上面的结果

三、总结

本文通过一个实例来给大家讲解了 Normalizer 的实际使用场景,希望对大家有所帮助!

声明:本文由原文《听说你还没掌握 Normalizer 的使用方法?》作者“魏彬”授权转载,对未经许可擅自使用者,保留追究其法律责任的权利。


image.png

阿里云Elastic Stack】100%兼容开源ES,独有9大能力,提供免费X-pack服务(单节点价值$6000)

相关活动


更多折扣活动,请访问阿里云 Elasticsearch 官网

阿里云 Elasticsearch 商业通用版,1核2G ,SSD 20G首月免费
阿里云 Logstash 2核4G首月免费


image.png

image.png

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
5月前
|
人工智能
87%的案例学习都停留在"看热闹"——用这套AI指令把案例变成你的决策资产
87%的案例学习只停留在看热闹。分享一套案例分析AI指令,通过结构化分析框架,帮你从案例中提炼可迁移的决策模型,提升学习效率。
411 14
|
机器学习/深度学习 Web App开发 人工智能
Colaboratory:手把手教你使用Google免费的云端IDE进行深度学习(免费的GPU加速)的详细攻略
Colaboratory:手把手教你使用Google免费的云端IDE进行深度学习(免费的GPU加速)的详细攻略
Colaboratory:手把手教你使用Google免费的云端IDE进行深度学习(免费的GPU加速)的详细攻略
|
10月前
|
数据采集 机器学习/深度学习 监控
代理IP并发控制:多线程爬虫的加速引擎
在数据采集领域,多线程爬虫结合代理IP并发控制技术,有效突破反爬机制。通过动态代理池与智能并发策略,显著提升采集效率并降低封禁率,成为高效数据抓取的关键方案。
311 0
|
10月前
|
SQL 关系型数据库 MySQL
explain的type几种类型详解
在 MySQL 中,使用 EXPLAIN(或 EXPLAIN SELECT ...)可以查看 SQL 语句的执行计划,而其中最重要的字段之一就是 type。它表示 MySQL 在执行查询时访问数据表的方式(即访问类型),也叫做 连接类型(Join Type)。
|
人工智能 数据可视化 搜索推荐
免费+数据安全!手把手教你在PC跑DeepSeek-R1大模型,小白也能秒变AI大神!
本地部署AI模型(如DeepSeek R1)保障数据隐私、节省成本且易于控制,通过Ollama平台便捷安装与运行,结合可视化工具(如Chatbox)及Python代码调用,实现高效、个性化的AI应用开发与使用。
1153 3
免费+数据安全!手把手教你在PC跑DeepSeek-R1大模型,小白也能秒变AI大神!
|
人工智能 IDE 程序员
与1.0 相比,通义灵码 2.0 AI 程序员有哪些功能、亮点、优势、场景?
通义灵码2.0相比1.0新增了工程级编码任务、单元测试生成和图片多模态问答等功能,支持多文件代码修改、批量生成单元测试及根据图片内容生成代码建议。亮点包括支持主流IDE、垂直智能体覆盖更多场景、企业级检索增强和灵活对话交互体验。技术优势涵盖多模态上下文感知、快速推理、企业数据个性化及一流代码生成效果。典型应用场景有新功能开发、跨语言编程、单元测试自动生成和错误排查修复。
1420 7
|
Ubuntu 网络安全 数据安全/隐私保护
搭建edk2编译环境
搭建edk2编译环境
1038 0
搭建edk2编译环境
|
域名解析 负载均衡 网络协议
阿里云云解析收费版和免费版有什么不同?域名解析DNS免费收费区别对比
阿里云域名解析DNS收费吗?域名解析DNS免费版和收费版有什么区别?
7500 0
阿里云云解析收费版和免费版有什么不同?域名解析DNS免费收费区别对比
|
Java API 网络架构
Spring Cloud Gateway的高级配置与实践
Spring Cloud Gateway的高级配置与实践

热门文章

最新文章