写在前面

ES内置的token filter很多,大部分实际工作中都用不到。这段时间准备ES认证工程师的考试,备考的时候需要熟悉这些不常用的filter。ES官方对一些filter只是一笔带过,我就想着把备考的笔记整理成博客备忘,也希望能帮助到有这方面需求的人。

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"
}

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的用法了,可能会有个疑问,这个过滤器用在什么场景呢?事实上,它适合前缀中缀检索,比如搜索推荐功能,当你只输入了某个句子的一部分时,搜索引擎会显示出以这部分为前缀的一些匹配项,从而实现推荐功能。

trim filter

这个filter从名字也可以看出它的功能,它可以删除前后空格。看个示例:

GET _analyze
{"tokenizer" : "keyword","filter": [{"type": "trim"}],  "text" : " 北京大学"
}

输出,

{"tokens" : [{"token" : " 北京大学","start_offset" : 0,"end_offset" : 5,"type" : "word","position" : 0}]
}

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等问题。

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}]
}

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"
}

总结一些ES不常用的filter相关推荐

  1. Es检索 must与filter区别

    参考文章:Es检索 must与filter区别 must和filter使用场景 先使用filter把不需要的过滤掉,例如现在有一个电子商务的网站,我要查询一个category的id为1下面的所有产品, ...

  2. ES基本查询,filter 查询,组合查询

    Elasticsearch 是功能强大的全文搜索引擎,用它的目的就是为了能快速的查询你想好要的数据 基本查询:利用Elasticsearch内置查询条件进行查询 组合查询:把多个基本查询组合在一起的复 ...

  3. ES系列之利用filter让你的查询效率飞起来

    bool查询简介 Elasticsearch(下面简称ES)中的bool查询在业务中使用也是比较多的.在一些非实时的分页查询,导出的场景,我们经常使用bool查询组合各种查询条件. Bool查询包括四 ...

  4. 关于es查询dsl的filter与must,term与match的区别

    [1]创建es7  索引 put localhost:9200/pdi_cust , 注意 PUB_CUST_LABEL 字段分词了. es7 不支持type ,所以 无需指定type. { &quo ...

  5. 微服务升级_SpringCloud Alibaba工作笔记0012---Gateway常用的Filter

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 可以看到,来的http请求,会先经过route路由,然后再经过filter,过滤器 gateway ...

  6. es 的常用搜索用法

    先导依赖: <dependency><groupId>org.elasticsearch.client</groupId><artifactId>ela ...

  7. Elasticsearch(ES)常用命令整理

    文章目录 前言 一.基本命令 1.1 获取所有_cat命令 1.2 获取es集群服务健康状态 1.3 查看es节点信息 1.4 查看es指定节点信息 二.索引操作 1. 查看ES中所有的索引 2. 新 ...

  8. es的query及filter

    为什么80%的码农都做不了架构师?>>>    ##query与filter的合并 Queries and filters merged 将filter的api列为deprecate ...

  9. 【ES】常用操作工具

    工欲善其事,必先利于器,es使用过程中,有些工具能帮助我们快速的上手和使用. 一.es-head es-head 是一款专门针对 es的客户端工具elasticSearch配置包,是一个基于node. ...

最新文章

  1. 北京自动驾驶提速:华为奥迪图森完成高速测试,百度包揽全部40张载人牌照...
  2. 通过Zabbix全面监控NetScaler负载均衡设备
  3. arcgis数据文件使用
  4. 04 数据操作 + 数据预处理【动手学深度学习v2】
  5. Android 移动开发知识体系
  6. mysql order by 自定义
  7. 10 行代码判定色*情*图片
  8. thinkphp的项目分组
  9. 【旧文章搬运】深入分析Win7的对象引用跟踪机制
  10. Android版本caj阅读器,CAJViewer安卓版
  11. [填坑]ubuntu16.04安装腾达U12无线网卡驱动
  12. 浏览班级为计算机的同学记录的命令,2011年全国计算机等级考试二级VFP笔记(4)...
  13. 结合个人规划对物联网(IOT)的一点思考
  14. word回车后间距太大_Word调整字号间距 Word回车换行间距变大
  15. 金融信贷风控中的机器学习
  16. Python Socket联机自动匹配双人五子棋(含登录注册系统与界面,数据库连接,可作结课作业,可用于学习)
  17. 墨画子卿第四章第6节:卷轴
  18. 小学5年级奥数分数应用题及答案
  19. 新手做SEO迷茫时应该做什么
  20. 小学计算机课活动小结,电脑教师工作小结

热门文章

  1. 基于nodejs的预约上门维修服务系统
  2. 湛江研发实验室装修设计图|布局
  3. matlab怎么匹配特征参数,sift特征匹配matlab
  4. 在window 10 x64下Apache24的下载、安装及虚拟主机配置(以wordpress为例)
  5. 优惠寄快递比价寄快递小程序功能介绍
  6. HCIA总结DAY4
  7. 多变量微积分笔记9——极坐标下的二重积分
  8. 我们的心情,你能体会吗,Ms. Phoebe?
  9. 免费的午餐-天猫农场种树得免费水果体验
  10. 装饰(Decorator)模式(包装模式)