20-二十、Elasticsearch 教程: 分析 ( Analysis )
Analysis
很多文档都将它翻译为 分析,其实也是蛮有道理的,因为 Analysis 不仅有分词的过程,还要负责分析已分词的情况
其实从使用上看,翻译成分词更好,毕竟提起分词,大家都知道啥意思,但分析,谁能第一时间想到要先分词
搜索操作过程中处理查询时,任何索引中的内容均由分析模块进行分析
分析模块一般由分析器、标记器、tokenfilters
和 charfilters
组成
如果没有显式的定义任何分析器,那么 Elasticsearch
会使用相应的默认的内建分析器,这些默认的分析器由分析模块注册,包括分析器、令牌、过滤器和标记器
范例
例如下面这个请求,创建一个默认的图片索引
POST http://localhost:9200/pictures
请求正文
{
"settings": {
"analysis": {
"analyzer": {
"index_analyzer": {
"tokenizer": "standard", "filter": [
"standard", "my_delimiter", "lowercase", "stop",
"asciifolding", "porter_stem"
]
},
"search_analyzer": {
"tokenizer": "standard", "filter": [
"standard", "lowercase", "stop", "asciifolding", "porter_stem"
]
}
},
"filter": {
"my_delimiter": {
"type": "word_delimiter",
"generate_word_parts": true,
"catenate_words": true,
"catenate_numbers": true,
"catenate_all": true,
"split_on_case_change": true,
"preserve_original": true,
"split_on_numerics": true,
"stem_english_possessive": true
}
}
}
}
}
分析过程
分析 ( analysis
) 是这样一个过程:
1、首先,标记化一个文本块为适用于倒排索引单独的 词 (term)
2、然后标准化这些词为标准形式,提高它们的 「 可搜索性 」 和 「 查全率 」
这两个工作由 分析器 (analyzer
) 完成的
一个分析器 (analyzer
) 一般由下面三个功能组成:
1、字符过滤器
首先字符串经过字符过滤器( character filter ),它们的工作是在标记化前处理字符串
字符过滤器能够去除 HTML 标记,或者转换 "&" 为 "and"
2、分词器
下一步,分词器 (tokenizer) 被标记化成独立的词
一个简单的分词器 (tokenizer) 可以根据空格或逗号将单词分开
译者注:这个在中文中不适用
3、标记过滤
最后,每个词都通过所有标记过滤(token filters),它可以修改词(例如将 "Quick" 转为小写),去掉词( 例如停用词像 "a"、"and"、"the"等等),或者增加词( 例如同义词像 "jump" 和 "leap" )
Elasticsearch 提供很多开箱即用的字符过滤器,分词器和标记过滤器
这些可以组合来创建自定义的分析器以应对不同的需求
分析器
分词器由一个标记器和可选的标记过滤器组成
下表列出了 Elasticsearch 提供的大量的内置分词器,这些分词器在分析模块中使用逻辑名称进行注册,可以在映射定义中或在某些 API 中引用它们
分析器 | 逻辑名 | 说明 |
---|---|---|
标准分词器 | standard | 可以自定义停止词(stopwords)和最大token长度(max_token_length)默认设置中,停止词为空,最大token长度为255 |
简单分词器 | simple | 该分词器使用了小写标记器(lowercasetokenizer) |
空白分词器 | whitespace | 该非瓷器使用了空白标记器(whitespacetokenizer) |
停止词分词器 | stop | 可以自定义停止词(stopwords)和停止词所在路径保存(stopwords_path)默认情况下,停止词使用了英文停止词(Englishstopwords),而停止词保存路径则是该英文停止词文件所在的路径 |
关键字分析器 | keyword | 该分析器将传递的所有参数内容视为一个单一标记,可以用于类似电话号码或邮政编码等 |
正则分析器 | pattern | 该分析器主要处理正则表达式。可以在此分析器中设置大小写敏感、模式、标志、停用词等 |
特定语言分析器 | 该分析仪处理诸如印地语,阿拉伯语,荷兰语等 | |
雪球分析器 | snowball | 该分析器使用标准的分词器,并且组合使用了标准过滤器、小写过滤器、停止词过滤器和雪球过滤器 |
自定义分析器 | custom | 主要在用户需要自定义分析器时使用,由自定义分词器,可选的标记过滤器和可选的字符过滤器组成可以设置的选项有分词器(tokenizer),过滤器(filter),字符过滤器(char_filter)和position_increment_gap |
分词器 ( Tokenizers )
分词器可以将一段分本分割为一个一个单词或词语
一个简单的分词器 ( tokenizer ) 可以根据空格或逗号将单词分开 ( 这个在中文中不适用 )
Elasticsearch 提供了有许多内置的分词器,我们也可用于自定义分词器
分词器 | 逻辑名 | 说明 |
---|---|---|
标准分词器 | standard | 该分词器使用基于词的语法来分词,可配置的选项有max_token_length |
edgeNGram分词器 | edgeNGram | 可以配置的选项有min_gram,max_gram,token_chars |
关键字分词器 | keyword | 该分词器将一整块的输入数据作为一个单独的分词。可以配置的选项有buffer_size |
字母分词器 | letter | 该分词器会将遇到非字母之前的所有字母视为一个词 |
小写分词器 | lowercase | 和字母分词器相同,但在获取到一个词后会将其中的大写字母转换为小写 |
NGram分词器 | nGram | 可配置的选项有min_gram(默认值1)、max_gram(默认值2)和token_chars |
空白符分词器 | whitespace | 这个过滤器使用空白符划分文本 |
正则分词器 | pattern | 使用正则表达式作为分词分隔符,可以配置的选项有Pattern,flags和group |
UAXEmailURLTokenizer | uax_url_email | 和标准分词器相同,但会把电子邮件和URL视为一个单独的词 |
层级路径分词器 | path_hierarchy | 该分词器会生成输入路径的所有可能路径可配置的选项有delimiter(默认/),replacement,buffer_size(默认1024),reverse(默认false)和skip(默认0) |
经典分词器 | classic | 该分词器使用基于词的基本语法来分词。可配置的选项有max_token_length |
泰语分词器 | thai | 使用内置的泰语分词算法对泰语进行分词 |
标记过滤器 ( token filters )
标记过滤可以修改词 ( 例如将 "Quick
" 转为小写),去掉词( 例如停用词像 "a
"、"and
"、"the
" 等等 ),或者增加词 ( 例如同义词像 "jump
" 和 "leap
" )
Elasticsearch
提供很多开箱即用的字符过滤器
字符过滤器
这些过滤器一般在分词器之前使用
字符过滤器查找特殊字符或 HTML
标记或指定模式,然后将其删除或更改为适当的单词,例如将 &
改成 and
, 同时移除 html
标记标签
下面的代码是一个分析器的例子,synonym.txt
文件用于指定同义词
{
"settings":{
"index":{
"analysis":{
"analyzer":{
"synonym":{
"tokenizer":"whitespace",
"filter":["synonym"]
}
},
"filter":{
"synonym":{
"type":"synonym",
"synonyms_path":"synonym.txt",
"ignore_case":"true"
}
}
}
}
}
}
希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com