作为分析器三大组成部分的另一部分,标记过滤器(token filters)是非必要的。token filters从标记生成器tokenizer那里接受标记输入流,可以用来修改(如将术语转成小写)、删除(如移除段词)或添加(如同义词)token。ES提供给了很多内置的标记过滤器,这些标记过滤器可以在自定义的分析器中使用。

1. 标准标记过滤器(Standard Token Filter)

standard标记过滤器标准化使用标准标记生成器提取的标记。目前standard标记过滤器啥事儿都没干,如果需要在将来的版本中添加某些过滤功能,它仍然是占位符。

2. ASCII码折叠标记过滤器(ASCII Folding Token Filter)

 这标记过滤器名字翻译的怪怪的,asciifolding过滤器将ASCII码不在ASCII表前127内的字母、数字和Unicode符号转换为ASCII等效字符(如果存在的话)。比如:

curl -X PUT "localhost:9200/asciifold_example" -H 'Content-Type: application/json' -d'
{"settings" : {"analysis" : {"analyzer" : {"default" : {"tokenizer" : "standard","filter" : ["standard", "asciifolding"]}}}}
}
'

asciifolding过滤器是可配置的,可接受的参数有:

  • preserve_original:表示是否保留原始标记以及输出折叠的标记,默认为false

下面是栗子:

curl -X PUT "localhost:9200/asciifold_example" -H 'Content-Type: application/json' -d'
{"settings" : {"analysis" : {"analyzer" : {"default" : {"tokenizer" : "standard","filter" : ["standard", "my_ascii_folding"]}},"filter" : {"my_ascii_folding" : {"type" : "asciifolding","preserve_original" : true}}}}
}
'

在将preserve_original设置为false后,然后分析文本١٢٣٤٥时并没有转换成相应的ASCII码,返回来的标记还是١٢٣٤٥(待解决)。

3. Flatten Graph Token Filter

注:Lucene中将Flatten Graph Token Filter标记为实验性功能。

4. 长度标记过滤器(Length Token Filter)

length标记过滤器会移除token流中太长或太短的标记,它是可配置的,接受的参数有:

  • min:表示最小数值,默认为0;
  • max:表示最大数值,默认为Integer.MAX_VALUE,即2147483647(2^31-1);

5. 小写标记过滤器(Lowercase Token Filter)

lowercase标记过滤器将标记token规范化为小写,它通过language参数支持希腊语、爱尔兰语和土耳其语小写标记过滤器,下面是栗子:

curl -X PUT "localhost:9200/lowercase_example" -H 'Content-Type: application/json' -d'
{"settings": {"analysis": {// 自定义2个分析器"analyzer": {// 标准分析器"standard_lowercase_example": {"type": "custom","tokenizer": "standard","filter": ["lowercase"]},// 希腊语分析器"greek_lowercase_example": {"type": "custom","tokenizer": "standard","filter": ["greek_lowercase"]}},"filter": {"greek_lowercase": {"type": "lowercase","language": "greek"}}}}
}
'

看到这才知道索引中可以直接放分析器,而不用放文档……所以自定义的分析器的时候可以这么搞。

6. 大写标记过滤器(Uppercase Token Filter)

lowercase类似,只是将术语转写成大写,参见上一小节。

7. NGram 标记过滤器(Ngram Token Filter)

nGram标记过滤器,可配置,接受的参数有:

  • min_gram:连词最小长度,默认为1;
  • max_gram:连词最大长度,默认为2;

索引级别可以使用index.max_ngram_diff参数控制max_gram-min_gram的最大差值,觉得有些鸡肋,如果标记生成器可以设置这些参数,还要在标记过滤器中设置个啥。

8. Edge NGram 标记过滤器(Edge Ngram Token Filter)

edgeNGram标记过滤器(只是锚定首字符)可配置,接受的参数有:

  • min_gram:连词的最小长度,默认为1;
  • max_gram:连词的最大长度,默认为2;
  • side:已弃用;

9. Porter Steam Token Filter

porter_stem标记过滤器根据Porter词干分析算法转换标记流。需要注意的是,给porter_stem标记过滤器的流必须已经转换成小写的,所以必须在之前使用小写标记生成器或小写标记过滤器(文档中将这个预处理操作置于Tokenizer链的下方)。比如当使用自定义的分析器时,确保lowercase标记过滤器位于过滤器列表中的porter_stem标记过滤器之前。

10. Shingle Token Filter

shingle标记过滤器将标记流构造带状,换而言之,它用单个标记创建了混合标记,比如please divide this sentence into shingles可以被标记为please dividedivide thisthis sentencesentence intointo shinglesshingle标记过滤器通过插入填充标记(使用带有下划线_的术语文本)来处理> 1的位置增量,它不处理位置增量为0的情况,这个过滤器是可配置的,接受参数有:

  • max_shingle_size:shingle的最大大小,默认为2;
  • min_shingle_size:shingle的最小大小,默认为2;
  • output_unigrams:表示输出是否包含输入标记以及shingles,默认为true
  • output_unigrams_if_no_shingles:如果output_unigramsfalse,如果没有可获取的shingles输出将会包含输入的标记(单字组);注意如果output_unigramstrue,那output_unigrams_if_no_shingles参数设置就没有意义,默认为false
  • token_separator:表示连接相邻标记以形成shingle时使用的字符串,默认为空格;
  • filler_token:表示用于替换流中没有实际标记的每个位置的字符串。例如,当stop过滤器与shingle过滤器一起使用时,如果位置增量大于1,则使用该参数设置的字符串,默认为_

 索引级别可设置index.max_shingle_diff参数以控制max_shingle_sizemin_shingle_size两者之间的差值。

11. 段词标记过滤器(Stop Token Filter)

stop类型标记过滤器可以将段词从标记流中移除,它是可配置的,接受的参数有:

  • stopwords:一个包含段词的数组,默认是_english_(内置的英语段词);
  • stopwords_path:一个段词配置文件的路径((相对于ES的配置文件config的位置,或直接写成绝对路径),每个段词应该在自己的“行”中(使用“行”进行分割),段词配置文件必须是UTF-8编码类型;
  • ignore_case:设置为true以首先小写所有单词,默认为false
  • remove_trailing:将其设置为false以不忽略搜索的最后一个术语(如果最后一个术语是段词的话),这对于完整的suggester在搜索时非常有用的(即使基本移除段词,像green a还是可以被扩展为green apple的),默认为true

下面是栗子:

curl -X PUT "localhost:9200/my_index" -H 'Content-Type: application/json' -d'
{"settings": {"analysis": {"filter": {"my_stop": {"type":       "stop","stopwords": ["and", "is", "the"]}}}}
}
'

上述是自定义了段词为andisthe就这三个,ES也内置了很多了段词,比如_english_就是其中一种(收录了常用英语段词),当然除此之外还有很多:_arabic_, _armenian_, _basque_, _bengali_, _brazilian_, _bulgarian_, _catalan_, _czech_, _danish_, _dutch_, _english_, _finnish_, _french_, _galician_, _german_, _greek_, _hindi_, _hungarian_, _indonesian_, _irish_, _italian_, _latvian_, _norwegian_, _persian_, _portuguese_, _romanian_, _russian_, _sorani_, _spanish_, _swedish_, _thai_, _turkish_,挑着用,如果不像移除任何段词,即为空,需要将stopwords指定为\_none_

12. 单词分隔符标记过滤器(Word Delimiter Token Filter)

word_delimiter标记过滤器将单词拆分为子词并对子词组执行可选的转换,将单词分割为子单词需要遵守下面的原则:

  • 直接按自带的分隔符分割(默认将所有非字母、数字字符看作分隔符,如WI-FI–>WIFI);
  • 按大小写转换分割(即驼峰分割,比如PowerShot–>PowerShot);
  • 按字母、数字分割(如SD500–>SD500);
  • 忽略每个子字上的前导和尾随字的内分隔符(如//hello---there, dudehellotheredude);
  • 每个子词都删除尾随的's(如O’Neil’sONeil);

word_delimiter标记过滤器是可配置的,接受的参数有:

  • generate_word_parts:表示是否分割单词,默认为true(就是是否分割单词为子词,如PowerShot–>PowerShot);
  • generate_number_parts:表示是否分割数字,默认为true(如500-42–>50042);
  • catenate_words:表示是否将单词部件的大部分被连接(如:wi-fi–>wifi),默认为false
  • catenate_numbers:表示是否将数字部件的最大运行被连接(如:500-42–>50042),默认为false
  • catenate_all:表示是否将所有分割得到的子词连接起来(如:"wi-fi-4000–>wifi4000),默认为false
  • split_on_case_change:表示是否在大、小写转换处分割(如PowerShot–>PowerShot),默认为true
  • preserve_original:表示是否分割的结果是否将原始文本包含在里面(如500-42–>50042500-42),默认为false
  • split_on_numerics:表示是否在数字处分割(如j2se–>j2se),默认为true
  • stem_english_possessive:表示是否为每个子字删除尾随的's,默认为true

高级可选参数:

  • protected_words:表示一个包含受保护的单词不是分隔符的列表,可以是一个数组[xx, xx],也可以设置protected_words_path,即配置了受保护字的文件(每行一个)路径,如果存在,则自动解析为基于ES的配置文件config/的位置路径;
  • type_table:表示一个自定义的类型映射,比如当使用type_table_path配置时:
# Map the $, %, '.', and ',' characters to DIGIT
# This might be useful for financial data.
$ => DIGIT
% => DIGIT
. => DIGIT
\\u002C => DIGIT# in some cases you might not want to split on ZWJ
# this also tests the case where we need a bigger byte[]
# see http://en.wikipedia.org/wiki/Zero-width_joiner
\\u200D => ALPHANUM

注:当使用standard标记过滤器时可能会干扰catenate_*preserve_original参数,因为原始的字符串可能在标记生成器中生成token的过程中丢失了标点符号,这种情况应该考虑使用whitespace标记生成器。

【注】

后续还有很多标记过滤器,用到的时候可以参考研读Token Filter。

ES学习记录10.2——ES分析器3(标记过滤器)相关推荐

  1. pandaboard ES学习之旅——2 ES环境搭建

    2 ES环境搭建 2.1 环境准备 Panda ES开发板1块: 5v电源1根,4G SD卡1个: 串口线1根(电脑波特率设置为115200): HDMI转DVI视频线1根(HDMI接头连开发板P1D ...

  2. GDI+ 学习记录(10): 线性渐变画刷 - LinearGradientBrush

    为什么80%的码农都做不了架构师?>>>    //线性渐变画刷 varg: TGPGraphics;lb: TGPLinearGradientBrush;rect: TGPRect ...

  3. 网络安全学习记录-10

    数据库注入 1.Mysql 注入-Dns 注入 注入没有回显: DNS 注入->让盲注变成显错注入 Load_File()读取文件 UNC路径 windows SMB 服务(共享文件)//des ...

  4. GDI+学习记录(10)- 影线画刷HatchBrush

    影线画刷(HatchBrush)的基本使用: private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Gr ...

  5. 我的Python——学习记录10.16

    列表 引用拷贝 仅仅进行引用拷贝,参与引用拷贝的对象所操作的列表相同 list1 = [1,2,3]list2 = list1id(list1) == id(list2)## output:True ...

  6. Django学习记录10——Django使用支付宝付款(电脑支付,手机网页支付,面对面扫码)

    目录 一.注册支付宝开放平台账号 1.注册 2.创建公私秘钥 2.项目中添加公私密钥 二.生成二维码 1.安装模块等 2.模块的结构 3.电脑支付 4.手机支付 5.面对面扫码(真二维码支付) 三.小 ...

  7. 斯坦福UE4 + C++课程学习记录 10:蓝图-优化宝箱动画

    目录 1. 优化宝箱打开动画 2. 查看蓝图运行过程 3. 添加金块 4. 关闭宝箱 5. 蓝图代码 在之前第7节的内容中,我们通过在SurItemChest中实现SurGameplayInterfa ...

  8. ES学习看这一篇文章就够了

    第一章 ES简介 第1节 ES介绍 1 2 3 4 1.Elasticsearch是一个基于Lucene的搜索服务器 2.提供了一个分布式的全文搜索引擎,基于restful web接口 3.Elast ...

  9. Android OpenGl Es 学习(二):定义顶点和着色器

    概述 这是一个新的系列,学习OpengGl Es,其实是<OpenGl Es 应用开发实践指南 Android卷>的学习笔记,感兴趣的可以直接看这本书,当然这个会记录自己的理解,以下只作为 ...

最新文章

  1. python 字符串转字典,字典转字符串 Expecting property name enclosed in double quotes
  2. 计算机视觉——自动识别车牌简介
  3. 与众不同 windows phone (32) - Communication(通信)之任意源组播 ASM(Any Source Multicast)...
  4. android频繁点击ui崩溃,android easeui 集成 启动崩溃
  5. c语言for循环语句java,C语言三种类型的循环语句
  6. optee userpace TA程序中的栈的设置
  7. VTK:标签轮廓用法实战
  8. Spring AOP注解方式实现
  9. Qt弹出的窗口始终位于界面最前面的方法
  10. 慧联A8最新检测使用教程V2.0.3
  11. Python学习笔记简单数据类型之字符串
  12. 【Docker】elasticsearch 监控工具 elasticsearch-HQ
  13. java计算机毕业设计教务管理系统源码+mysql数据库+系统+lw文档+部署
  14. Python项目 huobi量化交易系统
  15. 翟菜花:5G时代的顺风车,智能音箱该怎么坐?
  16. 用jQuery实现9宫格抽奖
  17. AS SSD软件查看信息说明
  18. 一文带你看懂TCP/IP协议 (更新中 现更新至网络层部分)
  19. Python Flask No.1_简介
  20. 做电商平台,用SAAS账号还是源码比较好呢?

热门文章

  1. 什么是html5营销方式,如何快狠准的创造出爆款HTML5营销案例
  2. 券商研报复现挑战赛|回望来时路,砥砺再出发
  3. 详细讲解如何安装原生安卓电子市场(android market)
  4. ArcGIS学习06:地理数据库
  5. layui 给table里面的添加图标_layui怎么添加icon图标?
  6. Ubuntu20.04中chrome显示异常问题
  7. 淘宝层级改版,五力模型上线!
  8. 谁说郭德纲的相声没有教育意义?
  9. 第25篇 画布元素 之 渐变(Gradients)
  10. SnackBar使用详解