ES学习记录10.2——ES分析器3(标记过滤器)
作为分析器三大组成部分的另一部分,标记过滤器(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 divide
、divide this
、this sentence
、sentence into
和into shingles
。shingle
标记过滤器通过插入填充标记(使用带有下划线_
的术语文本)来处理> 1的位置增量,它不处理位置增量为0的情况,这个过滤器是可配置的,接受参数有:
max_shingle_size
:shingle的最大大小,默认为2;min_shingle_size
:shingle的最小大小,默认为2;output_unigrams
:表示输出是否包含输入标记以及shingles,默认为true
;output_unigrams_if_no_shingles
:如果output_unigrams
是false
,如果没有可获取的shingles输出将会包含输入的标记(单字组);注意如果output_unigrams
是true
,那output_unigrams_if_no_shingles
参数设置就没有意义,默认为false
;token_separator
:表示连接相邻标记以形成shingle时使用的字符串,默认为空格;filler_token
:表示用于替换流中没有实际标记的每个位置的字符串。例如,当stop
过滤器与shingle
过滤器一起使用时,如果位置增量大于1,则使用该参数设置的字符串,默认为_
;
索引级别可设置index.max_shingle_diff
参数以控制max_shingle_size
和min_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"]}}}}
}
'
上述是自定义了段词为and
、is
和the
就这三个,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
–>WI
和FI
); - 按大小写转换分割(即驼峰分割,比如
PowerShot
–>Power
和Shot
); - 按字母、数字分割(如
SD500
–>SD
和500
); - 忽略每个子字上的前导和尾随字的内分隔符(如
//hello---there, dude
→hello
、there
、dude
); - 每个子词都删除尾随的
's
(如O’Neil’s
→O
、Neil
);
word_delimiter
标记过滤器是可配置的,接受的参数有:
generate_word_parts
:表示是否分割单词,默认为true
(就是是否分割单词为子词,如PowerShot
–>Power
和Shot
);generate_number_parts
:表示是否分割数字,默认为true
(如500-42
–>500
、42
);catenate_words
:表示是否将单词部件的大部分被连接(如:wi-fi
–>wi
、fi
),默认为false
;catenate_numbers
:表示是否将数字部件的最大运行被连接(如:500-42
–>50042
),默认为false
;catenate_all
:表示是否将所有分割得到的子词连接起来(如:"wi-fi-4000
–>wifi4000
),默认为false
;split_on_case_change
:表示是否在大、小写转换处分割(如PowerShot
–>Power
、Shot
),默认为true
;preserve_original
:表示是否分割的结果是否将原始文本包含在里面(如500-42
–>500
、42
、500-42
),默认为false
;split_on_numerics
:表示是否在数字处分割(如j2se
–>j
、2
、se
),默认为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(标记过滤器)相关推荐
- pandaboard ES学习之旅——2 ES环境搭建
2 ES环境搭建 2.1 环境准备 Panda ES开发板1块: 5v电源1根,4G SD卡1个: 串口线1根(电脑波特率设置为115200): HDMI转DVI视频线1根(HDMI接头连开发板P1D ...
- GDI+ 学习记录(10): 线性渐变画刷 - LinearGradientBrush
为什么80%的码农都做不了架构师?>>> //线性渐变画刷 varg: TGPGraphics;lb: TGPLinearGradientBrush;rect: TGPRect ...
- 网络安全学习记录-10
数据库注入 1.Mysql 注入-Dns 注入 注入没有回显: DNS 注入->让盲注变成显错注入 Load_File()读取文件 UNC路径 windows SMB 服务(共享文件)//des ...
- GDI+学习记录(10)- 影线画刷HatchBrush
影线画刷(HatchBrush)的基本使用: private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Gr ...
- 我的Python——学习记录10.16
列表 引用拷贝 仅仅进行引用拷贝,参与引用拷贝的对象所操作的列表相同 list1 = [1,2,3]list2 = list1id(list1) == id(list2)## output:True ...
- Django学习记录10——Django使用支付宝付款(电脑支付,手机网页支付,面对面扫码)
目录 一.注册支付宝开放平台账号 1.注册 2.创建公私秘钥 2.项目中添加公私密钥 二.生成二维码 1.安装模块等 2.模块的结构 3.电脑支付 4.手机支付 5.面对面扫码(真二维码支付) 三.小 ...
- 斯坦福UE4 + C++课程学习记录 10:蓝图-优化宝箱动画
目录 1. 优化宝箱打开动画 2. 查看蓝图运行过程 3. 添加金块 4. 关闭宝箱 5. 蓝图代码 在之前第7节的内容中,我们通过在SurItemChest中实现SurGameplayInterfa ...
- ES学习看这一篇文章就够了
第一章 ES简介 第1节 ES介绍 1 2 3 4 1.Elasticsearch是一个基于Lucene的搜索服务器 2.提供了一个分布式的全文搜索引擎,基于restful web接口 3.Elast ...
- Android OpenGl Es 学习(二):定义顶点和着色器
概述 这是一个新的系列,学习OpengGl Es,其实是<OpenGl Es 应用开发实践指南 Android卷>的学习笔记,感兴趣的可以直接看这本书,当然这个会记录自己的理解,以下只作为 ...
最新文章
- python 字符串转字典,字典转字符串 Expecting property name enclosed in double quotes
- 计算机视觉——自动识别车牌简介
- 与众不同 windows phone (32) - Communication(通信)之任意源组播 ASM(Any Source Multicast)...
- android频繁点击ui崩溃,android easeui 集成 启动崩溃
- c语言for循环语句java,C语言三种类型的循环语句
- optee userpace TA程序中的栈的设置
- VTK:标签轮廓用法实战
- Spring AOP注解方式实现
- Qt弹出的窗口始终位于界面最前面的方法
- 慧联A8最新检测使用教程V2.0.3
- Python学习笔记简单数据类型之字符串
- 【Docker】elasticsearch 监控工具 elasticsearch-HQ
- java计算机毕业设计教务管理系统源码+mysql数据库+系统+lw文档+部署
- Python项目 huobi量化交易系统
- 翟菜花:5G时代的顺风车,智能音箱该怎么坐?
- 用jQuery实现9宫格抽奖
- AS SSD软件查看信息说明
- 一文带你看懂TCP/IP协议 (更新中 现更新至网络层部分)
- Python Flask No.1_简介
- 做电商平台,用SAAS账号还是源码比较好呢?