【Elasticsearch】不常用 length filer、ngram filter、trim filter、truncate filter、unique filter、synonym token
1.概述
转载:总结一些ES不常用的filter
ES内置的token filter很多,大部分实际工作中都用不到。这段时间准备ES认证工程师的考试,备考的时候需要熟悉这些不常用的filter。ES官方对一些filter只是一笔带过,我就想着把备考的笔记整理成博客备忘,也希望能帮助到有这方面需求的人。
2.length filer
官方解释:
A token filter of type length that removes words that are too long or too short for the stream.
这个filter的功能是,去掉过长或者过短的单词。它有两个参数可以设置:
- min 定义最短长度,默认是0
- max 定义最长长度,默认是Integer.MAX_VALUE
先来简单测试下它的效果,
GET _analyze
{"tokenizer" : "standard","filter": [{"type": "length", "min":1, "max":3 }], "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone"
}
输出:
{"tokens" : [{"token" : "The","start_offset" : 0,"end_offset" : 3,"type" : "<ALPHANUM>","position" : 0},{"token" : "2","start_offset" : 4,"end_offset" : 5,"type" : "<NUM>","position" : 1},{"token" : "the","start_offset" : 36,"end_offset" : 39,"type" : "<ALPHANUM>","position" : 7}]
}
可以看到大于3的单词都被过滤掉了。
如果要给某个索引指定length filer,可以参考下面这个示例:
PUT /length_example
{"settings" : {"analysis" : {"analyzer" : {"default" : {"tokenizer" : "standard","filter" : ["my_length"]}},"filter" : {"my_length" : {"type" : "length","min" : 1,"max": 3}}}}
}GET length_example/_analyze
{"analyzer": "default", "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bonet"
}
3.ngram filter
ngram filter的意义可以参考ngram tokenize,后者相当于是keyword tokenizer 加上 ngram filter,效果是一样的。
它的含义是:首先将text文本切分,执行时采用N-gram切割算法。N-grams 算法,像一个穿越单词的滑窗,是一个特定长度的持续的字符序列。
说着挺抽象,来个例子:
GET _analyze
{"tokenizer": "ngram","text": "北京大学"
}GET _analyze
{"tokenizer" : "keyword","filter": [{"type": "ngram", "min_gram":1, "max_gram":2 }], "text" : "北京大学"
}
可以看到有两个属性,
- min_gram 在单词中最小字符长度,且默认为1
- max_gram 在单词中最大字符长度,且默认为2
max和min的间隔,也就是步长默认最大只能是1,可以通过设置索引的max_ngram_diff修改,示例如下:
PUT /ngram_example
{"settings" : {"index": {"max_ngram_diff": 10},"analysis" : {"analyzer" : {"default" : {"tokenizer" : "keyword","filter" : ["my_ngram"]}},"filter" : {"my_ngram" : {"type" : "ngram","min_gram" : 2,"max_gram": 4}}}}
}
使用索引的analyzer测试,
GET ngram_example/_analyze
{"analyzer": "default", "text" : "北京大学"
}
输出,
{"tokens" : [{"token" : "北京","start_offset" : 0,"end_offset" : 4,"type" : "word","position" : 0},{"token" : "北京大","start_offset" : 0,"end_offset" : 4,"type" : "word","position" : 0},{"token" : "北京大学","start_offset" : 0,"end_offset" : 4,"type" : "word","position" : 0},{"token" : "京大","start_offset" : 0,"end_offset" : 4,"type" : "word","position" : 0},{"token" : "京大学","start_offset" : 0,"end_offset" : 4,"type" : "word","position" : 0},{"token" : "大学","start_offset" : 0,"end_offset" : 4,"type" : "word","position" : 0}]
}
你应该已经基本了解ngram filter的用法了,可能会有个疑问,这个过滤器用在什么场景呢?事实上,它适合前缀中缀检索,比如搜索推荐功能,当你只输入了某个句子的一部分时,搜索引擎会显示出以这部分为前缀的一些匹配项,从而实现推荐功能。
在7.9 推出的模糊匹配中,也是使用了这个东东
4.trim filter
这个filter从名字也可以看出它的功能,它可以删除前后空格。看个示例:
GET _analyze
{"tokenizer" : "keyword","filter": [{"type": "trim"}], "text" : " 北京大学"
}
输出,
{"tokens" : [{"token" : "北京大学","start_offset" : 0,"end_offset" : 5,"type" : "word","position" : 0}]
}
5.truncate filter
这个filter有一个length属性,可以截断分词后的term,确保term的长度不会超过length。下面看个示例,
GET _analyze
{"tokenizer" : "keyword","filter": [{"type": "truncate", "length": 3}], "text" : "北京大学"
}
输出,
{"tokens" : [{"token" : "北京大","start_offset" : 0,"end_offset" : 4,"type" : "word","position" : 0}]
}
再来一个示例:
GET _analyze
{"tokenizer" : "standard","filter": [{"type": "truncate", "length": 3}], "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
输出,
{"tokens" : [{"token" : "The","start_offset" : 0,"end_offset" : 3,"type" : "<ALPHANUM>","position" : 0},{"token" : "2","start_offset" : 4,"end_offset" : 5,"type" : "<NUM>","position" : 1},{"token" : "QUI","start_offset" : 6,"end_offset" : 11,"type" : "<ALPHANUM>","position" : 2},...
这个filter在keyword比较长的场景下,可以用来避免出现一些OOM等问题。
6.unique filter
unique词元过滤器的作用就是保证同样结果的词元只出现一次。看个示例:
GET _analyze
{"tokenizer": "standard","filter": ["unique"],"text": "this is a test test test"
}
输出,
{"tokens" : [{"token" : "this","start_offset" : 0,"end_offset" : 4,"type" : "<ALPHANUM>","position" : 0},{"token" : "is","start_offset" : 5,"end_offset" : 7,"type" : "<ALPHANUM>","position" : 1},{"token" : "a","start_offset" : 8,"end_offset" : 9,"type" : "<ALPHANUM>","position" : 2},{"token" : "test","start_offset" : 10,"end_offset" : 14,"type" : "<ALPHANUM>","position" : 3}]
}
7.synonym token filter
同义词过滤器。它的使用场景是这样的,比如有一个文档里面包含番茄这个词,我们希望搜索番茄或者西红柿,圣女果都可以找到这个文档。示例如下:
PUT /synonym_example
{"settings": {"analysis" : {"analyzer" : {"synonym" : {"tokenizer" : "whitespace","filter" : ["my_synonym"]}},"filter" : {"my_synonym" : {"type" : "synonym","synonyms_path" : "analysis/synonym.txt"}}}}
}
我们需要在ES实例的config目录下,新建一个analysis/synonym.txt的文件,内容如下:
番茄,西红柿,圣女果
记得要重启
。
然后测试下,
GET /synonym_example/_analyze
{"analyzer": "synonym","text": "番茄"
}
输出,
{"tokens" : [{"token" : "番茄","start_offset" : 0,"end_offset" : 2,"type" : "word","position" : 0},{"token" : "西红柿","start_offset" : 0,"end_offset" : 2,"type" : "SYNONYM","position" : 0},{"token" : "圣女果","start_offset" : 0,"end_offset" : 2,"type" : "SYNONYM","position" : 0}]
}
如何组合使用多个filter
我们知道一个分析器可以包含多个过滤器,那怎么来实现呢?看下面这个例子:
GET _analyze
{"tokenizer" : "standard","filter": [{"type": "length", "min":1, "max":4 },{"type": "truncate", "length": 3}], "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}
这个例子中,我们把length filter和truncate filter组合在一起使用,它首先基于标准分词,分词后的term大于4字节的会首先被过滤掉,接着剩下的term会被截断到3个字节。输出结果是,
{"tokens" : [{"token" : "The","start_offset" : 0,"end_offset" : 3,"type" : "<ALPHANUM>","position" : 0},{"token" : "2","start_offset" : 4,"end_offset" : 5,"type" : "<NUM>","position" : 1},{"token" : "ove","start_offset" : 31,"end_offset" : 35,"type" : "<ALPHANUM>","position" : 6},{"token" : "the","start_offset" : 36,"end_offset" : 39,"type" : "<ALPHANUM>","position" : 7},{"token" : "laz","start_offset" : 40,"end_offset" : 44,"type" : "<ALPHANUM>","position" : 8},{"token" : "bon","start_offset" : 51,"end_offset" : 55,"type" : "<ALPHANUM>","position" : 10}]
}
如果是在索引中使用的话,参考下面这个例子:
PUT /length_truncate_example
{"settings" : {"analysis" : {"analyzer" : {"default" : {"tokenizer" : "standard","filter" : ["my_length", "my_truncate"]}},"filter" : {"my_length" : {"type" : "length","min" : 1,"max": 4},"my_truncate" : {"type" : "truncate","length": 3}}}}
}GET length_truncate_example/_analyze
{"analyzer": "default", "text" : "The 2 QUICK Brown-Foxes jumped over the lazy dog's bonet"
}
【Elasticsearch】不常用 length filer、ngram filter、trim filter、truncate filter、unique filter、synonym token相关推荐
- java filter 不过滤器_Java中的Filter过滤器
Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...
- 比 Bloom Filter 节省25%空间!Ribbon Filter 在 Lindorm中的应用
1 前言 Lindorm是一个低成本高吞吐的多模数据库,目前,Lindorm是阿里内部数据体量最大,覆盖业务最广的数据库产品.超高的性能和低RT一直是Lindorm追求的目标,因此Lindorm也在不 ...
- 比 Bloom Filter 节省25%空间!Ribbon Filter 在 Lindorm 中的应用
1 前言 Lindorm是一个低成本高吞吐的多模数据库,目前,Lindorm是阿里内部数据体量最大,覆盖业务最广的数据库产品.超高的性能和低RT一直是Lindorm追求的目标,因此Lindorm也在不 ...
- django filter查询多选_Django:使用filter的pk进行多值查询操作
由于想要做收藏夹的功能,所以希望能够一次性查询出所有id的对象,查看文档,找到了如下方法 pk是primary key的缩写,顾名思义pk_in就是primary key在某一个范围内,具体操作(以自 ...
- Lucene6去掉了Filter但是可以用BooleanQuery实现Filter查询
Lucene在6.0版本之后彻底废除了Filter的使用,采用BooleanQuery来实现Filter的功能,核心代码如下: TermQuery termQuery = new TermQuery( ...
- 使用ffmpeg的filter处理yuv数据包括split filter(分流)、crop filter(裁剪)、vflip filter(垂直向上的翻转)、overlay filter(合成)
使用ffmpeg的filter处理yuv数据包括split filter(分流).crop filter(裁剪).vflip filter(垂直向上的翻转).overlay filter(合成) #i ...
- java web filter链_filter过滤链:Filter链是如何构建的?
在一个Web应用程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截.如果多个Filter程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链 ...
- “Abp.AbpException: Unknown filter name: MayHaveTenant. Be sure this filter is registered before.”的解决
本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:"Abp.AbpException: Unknown filter name: MayHaveTenant. Be sure ...
- 布隆过滤器(Bloom Filter)、布谷鸟过滤器(Cuckoo Filter)、商过滤器(quotient filter)(持续更新~~~~)
过滤器 位图 布隆过滤器(Bloom Filter) 布谷鸟过滤器(Cuckoo Filter) 商过滤器(quotient filter) 文章参考链接 位图 在讨论布隆过滤器之前,先看一下位图是什 ...
最新文章
- 【深度学习基础】一步一步讲解卷积神经网络
- Puppeteer入门初探
- 电子城西区北扩规划一路道路工程_雁塔区电子城街道重点项目进度
- BZOJ 2683: 简单题(CDQ 分治)
- 软件需求规格说明书_4.软件需求最佳实践笔记 | 软件需求与需求工程
- 发那可g10_fanuc系统中的G10格式会根据输入的数据不同而不同
- SARIMA时间序列模型预测城市房价数据
- 大功率UWB模块 XZM3000 移植手册 《从DWM1000到XZM3000移植手册》
- 三主模式高可用k8s集群搭建
- 机器视觉中常用图像处理库都有哪些?
- flea-db使用之基于对象池的FleaJPAQuery
- LoadRunner性能测试培训大纲
- vue 点击当前路由怎么重新加载_Vue 路由切换时页面内容没有重新加载的解决方法...
- java 谷歌地图_如何使用java在浏览器上显示谷歌地图?
- 银行中的等额本息,及其与等额本金的对比
- Python 静态方法 类方法
- linux informatica教程,linux下informatica服务安装和配置
- Sawyer_Physics_Simulator_Guidelines
- 仲裁结果出炉,FF将绕过恒大健康获得5亿美元外部融资
- springboot大学生兼职网站开发与设计毕业设计源码311734