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相关推荐

  1. java filter 不过滤器_Java中的Filter过滤器

    Filter简介 Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件 ...

  2. 比 Bloom Filter 节省25%空间!Ribbon Filter 在 Lindorm中的应用

    1 前言 Lindorm是一个低成本高吞吐的多模数据库,目前,Lindorm是阿里内部数据体量最大,覆盖业务最广的数据库产品.超高的性能和低RT一直是Lindorm追求的目标,因此Lindorm也在不 ...

  3. 比 Bloom Filter 节省25%空间!Ribbon Filter 在 Lindorm 中的应用

    1 前言 Lindorm是一个低成本高吞吐的多模数据库,目前,Lindorm是阿里内部数据体量最大,覆盖业务最广的数据库产品.超高的性能和低RT一直是Lindorm追求的目标,因此Lindorm也在不 ...

  4. django filter查询多选_Django:使用filter的pk进行多值查询操作

    由于想要做收藏夹的功能,所以希望能够一次性查询出所有id的对象,查看文档,找到了如下方法 pk是primary key的缩写,顾名思义pk_in就是primary key在某一个范围内,具体操作(以自 ...

  5. Lucene6去掉了Filter但是可以用BooleanQuery实现Filter查询

    Lucene在6.0版本之后彻底废除了Filter的使用,采用BooleanQuery来实现Filter的功能,核心代码如下: TermQuery termQuery = new TermQuery( ...

  6. 使用ffmpeg的filter处理yuv数据包括split filter(分流)、crop filter(裁剪)、vflip filter(垂直向上的翻转)、overlay filter(合成)

    使用ffmpeg的filter处理yuv数据包括split filter(分流).crop filter(裁剪).vflip filter(垂直向上的翻转).overlay filter(合成) #i ...

  7. java web filter链_filter过滤链:Filter链是如何构建的?

    在一个Web应用程序中可以注册多个Filter程序,每个Filter程序都可以针对某一个URL进行拦截.如果多个Filter程序都对同一个URL进行拦截,那么这些Filter就会组成一个Filter链 ...

  8. “Abp.AbpException: Unknown filter name: MayHaveTenant. Be sure this filter is registered before.”的解决

    本文由 比特飞 原创发布,欢迎大家踊跃转载. 转载请注明本文地址:"Abp.AbpException: Unknown filter name: MayHaveTenant. Be sure ...

  9. 布隆过滤器(Bloom Filter)、布谷鸟过滤器(Cuckoo Filter)、商过滤器(quotient filter)(持续更新~~~~)

    过滤器 位图 布隆过滤器(Bloom Filter) 布谷鸟过滤器(Cuckoo Filter) 商过滤器(quotient filter) 文章参考链接 位图 在讨论布隆过滤器之前,先看一下位图是什 ...

最新文章

  1. 【深度学习基础】一步一步讲解卷积神经网络
  2. Puppeteer入门初探
  3. 电子城西区北扩规划一路道路工程_雁塔区电子城街道重点项目进度
  4. BZOJ 2683: 简单题(CDQ 分治)
  5. 软件需求规格说明书_4.软件需求最佳实践笔记 | 软件需求与需求工程
  6. 发那可g10_fanuc系统中的G10格式会根据输入的数据不同而不同
  7. SARIMA时间序列模型预测城市房价数据
  8. 大功率UWB模块 XZM3000 移植手册 《从DWM1000到XZM3000移植手册》
  9. 三主模式高可用k8s集群搭建
  10. 机器视觉中常用图像处理库都有哪些?
  11. flea-db使用之基于对象池的FleaJPAQuery
  12. LoadRunner性能测试培训大纲
  13. vue 点击当前路由怎么重新加载_Vue 路由切换时页面内容没有重新加载的解决方法...
  14. java 谷歌地图_如何使用java在浏览器上显示谷歌地图?
  15. 银行中的等额本息,及其与等额本金的对比
  16. Python 静态方法 类方法
  17. linux informatica教程,linux下informatica服务安装和配置
  18. Sawyer_Physics_Simulator_Guidelines
  19. 仲裁结果出炉,FF将绕过恒大健康获得5亿美元外部融资
  20. springboot大学生兼职网站开发与设计毕业设计源码311734

热门文章

  1. 由于供不应求 部分新款Apple Watch机型推迟至11月交付
  2. 苏宁易购:公司改选董事 同意聘任张近东为公司名誉董事长
  3. 新法案下 苹果或被禁止在设备上预装自家应用
  4. OPPO公开柔性显示相关专利 提高对柔性显示屏支撑强度
  5. 电动汽车冬季悲歌:我不是在充电,就是在充电的路上
  6. 《原神》月入16亿,米哈游为何仍然被嫌弃?
  7. 百度上线独立视频App百度看看,能搜到微视、B站内容?
  8. 否极泰来?中国恒大暴涨17% 恒大汽车涨超6%
  9. 微信又上线新功能,能让你更会聊天?
  10. 前魅族副总裁李楠上手魅族17:颜值提升了