听说你还没掌握Normalizer的使用方法?
在 Elasticsearch 中处理字符串类型的数据时,如果我们想把整个字符串作为一个完整的 term 存储,我们通常会将其类型 type 设定为 keyword。但有时这种设定又会给我们带来麻烦,比如同一个数据再写入时由于没有做好清洗,导致大小写不一致,比如 apple、Apple两个实际都是 apple,但当我们去搜索 apple时却无法返回 Apple的文档。要解决这个问题,就需要 Normalizer出场了。废话不多说,直接上手看!
1. 上手
我们先来重现一下开篇的问题:
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,而查询二没有文档返回,原因如下图所示:
1、Docs写入Elasticsearch时由于 type是 keyword,分词结果为原始字符串;
2、查询 Query 时分词默认是采用和字段写时相同的配置,因此这里也是keyword,因此分词结果也是原始字符;
3、两边的分词进行匹对,便得出了我们上面的结果。
2、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条文档。
问题解决了!我们来看下是如何解决的:
文档写入时由于加入了 normalizer,所有的 term都会被做小写处理
查询时搜索词同样采用有 normalizer的配置,因此处理后的 term也是小写的
两边分词匹对,就得到了我们上面的结果
3. 总结
本文通过一个实例来给大家讲解了 Normalizer的实际使用场景,希望对大家有所帮助!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Drill storage plugin实现原理分析
Drill Storage Plugin介绍 Drill是一个交互式SQL查询引擎,官方默认支持的数据源有hive、hbase、kafka、kudu、mongo、opentsdb、jdbc等,其中jdbc storage plugin可以覆盖所有支持jdbc协议的数据源,如:mysql、oracle等关系型数据库。所有数据源的接入都是通过drill的storage plugin实现的,理论上Drill通过storage plugin机制可以支持对任何数据源进行异构查询。 Drill作为一个SQL查询引擎,它跟传统数据库有着很多相似之处,主要包括SQL Parser、SQL Validator、Query Optimizer、Data Flow Operators等几部分。如下图所示,SQL Parser阶段会把SQL语句解析为SQL查
- 下一篇
原创译文 | Sphero发布Spark Bolt,AI机器人进攻教育领域
自Sphero宣布Sprk+已经过去大约两年了,Sprk+是一款塑料材质,可编程的,应用程序启用的机器人球,用于编程教育。过去的几个月,该公司与迪士尼合作推出了Ultimate Lightning McQueen,R2D2,BB-9E和Spider-Man等产品,并推出了更便宜,体积更小的Sprk+伴侣 - Sphero Mini,这款伴侣产品更少关注教育,更多关注游戏和活动。 9月10日,这家总部位于科罗拉多州丹佛市的创业公司Sphero从其Skunkworks实验室推出了Spark Bolt,这是一款经过升级的Sprk +,带有一些新的铃声和口哨声。 根据联合创始人兼首席架构师亚当威尔逊的说法,该产品表现了Sphero对教育领域的重视。他说,已有超过20,000所学校将公司的产品纳入其课程。 “在过去的两年里,我们学会了如何打造一个新特色,”威尔逊在电话采访中告诉记者,“我们的产品一直都提供可编程功能。当然如果你不想对其编程,你可以选择不编程。我们鼓励你玩这些功能,因为Bolt有更深入的编程组件。“ Bolt拥有防紫外线透明塑料外壳,具有防水和“高度耐用”的特点,可点击传感器包括磁...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境