网站首页 文章专栏 elasticsearch学习(五)----分析器
分析(analysis)是这样一个过程:
首先,表征化一个文本块为适用于倒排索引单独的词(term)。
然后标准化这些词为标准形式,提高他们的“可搜索性”或“查全率” 。这个工作是分析器(analyzer)完成的。一个分析器(analyzer)只是一个包装用于将三个功能放到一个包里:
1.字符过滤器 (char_filter)
首先,字符串按顺序通过每个字符过滤器,他们的任务是在分词前整理字符串
一个字符过滤器可以用来去掉HTML,或者将&转化成and
2.分词器 (tokenizer)
其次,字符串被分词器分爲单个的词条,一个简单的分词器遇到空格和标点的时候,可能会将文本拆分成词条
Hello how are you?会被ES预设的分词器standard分成hello、how、are、you
3.Token 过滤器 (filter)
最后,词条按顺序通过每个 token 过滤器,这个过程可能会改变词条(Quick -> quick)、删除词条(a、an、and、the...)、增加词条(jump和leap这种同义词)
一般,我们都在配置文件(elasticsearch.yml)中配置好我们的默认分析器,
index : analysis : analyzer : standard : type : standard stopwords : [stop1, stop2] myAnalyzer1 : type : standard stopwords : [stop1, stop2, stop3] max_token_length : 500 # configure a custom analyzer which is # exactly like the default standard analyzer myAnalyzer2 : tokenizer : standard filter : [standard, lowercase, stop] tokenizer : myTokenizer1 : type : standard max_token_length : 900 myTokenizer2 : type : keyword buffer_size : 512 filter : myTokenFilter1 : type : stop stopwords : [stop1, stop2, stop3, stop4] myTokenFilter2 : type : length min : 0 max : 2000
但是,我们往往会对一些特殊的业务,做些特殊的配置。
个人比较建议在建索引时,配置相应的分词器,如下:
分词器使用的两个情形:
1,Index time analysis. 创建或者更新文档时,会对文档进行分词
2,Search time analysis. 查询时,对查询语句分词
1.创建时定义分词属性 可以自定义分词属性,自定义同义词库
自定义分词器
#"char_filter": { 自定义的字符过滤器 },
#"tokenizer": { 自定义的分词器 },
#"filter": { 自定义的token过滤器 },
#"analyzer": { 自定义的分析器,可以将上面的char_filter、tokenizer、filter用不同的组合拼起来,形成不同的分析器 }
#创建新索引 curl -XPUT http://192.168.1.133:9200/hbh -H 'Content-Type:application/json' -d ' { "settings" : { "number_of_shards" : 3, #分片数量 "number_of_replicas" : 1 #副本数量 "analysis": { #分析 "filter": { "hbh_synonym_filter": { #定义了一种规则 "type": "synonym", #同义词 "synonyms_path": "ik/synonyms.txt" #同义词文件 } }, #自定义一个分词器 "analyzer": { #自定义一个分词器名称为hbh_synonyms "hbh_synonyms": { #分词器 使用ik中文分成 粗粉 "tokenizer": "ik_smart", "filter": [ #字符小写 "lowercase", #使用上面定义的hbh_synonym_filter 过滤器 "hbh_synonym_filter" ] } } } } } ' curl -XPUT http://192.168.1.133:9200/hbh/test1/_mapping -H 'Content-Type:application/json' -d ' { "properties": { "id": { "type": "integer" }, "name":{ "type":"keyword"#不需要进行分词,可以被用来检索过滤、排序和聚合 }, "love":{ "type":"text",#被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合,建立索引;允许es来检索这些词,text类型不能用来排序和聚合 "analyzer": "ik_smart"" # ik中午分词器的 粗分 }, "abstract":{ "type":"text", "analyzer": "hbh_synonyms"" #使用自定义的分词器 }, "cover":{ "type":"text" }, "english":{ "type":"text", "analyzer": "standard" #es 内置的标准分词器 } } } '
2.查询时,对查询语句分词
"love":{ "type":"text", "analyzer": "ik_smart"" # ik中午分词器的 粗分 "search_analyzer": "ik_max_word"" # 只有在查询时使用这种细度分词 },
内置的分析器 analyzer
1.标准分析器:standard analyzer
标准分析器(standard analyzer):是elasticsearch的默认分析器,该分析器综合了大多数欧洲语言来说合理的默认模块,包括标准分词器、标准分词过滤器、小写转换分词过滤器和停用词分词过滤器。
2.简单分析器:simple analyzer
简单分析器(simple analyzer):简单分析器仅使用了小写转换分词,这意味着在非字母处进行分词,并将分词自动转换为小写。这个分词器对于亚种语言来说效果不佳,因为亚洲语言不是根据空白来分词的,所以一般用于欧洲言中。
3.空白分析器:whitespace analyzer
空白(格)分析器(whitespace analyzer):只是根据空白将文本切分为若干分词!
4.停用词分析器:stop analyzer
停用词分析(stop analyzer)和简单分析器的行为很像,只是在分词流中额外的过滤了停用词。
5.关键词分析器:keyword analyzer
关键词分析器(keyword analyzer)将整个字段当做单独的分词,如无必要,我们不在映射中使用关键词分析器。
6.模式分析器:pattern analyzer
模式分析器(pattern analyzer)允许我们指定一个分词切分模式。但是通常更佳的方案是使用定制的分析器,组合现有的模式分词器和所需要的分词过滤器更加合适。
7.语言和多语言分析器:chinese
elasticsearch为很多世界流行语言提供良好的、简单的、开箱即用的语言分析器集合:阿拉伯语、亚美尼亚语、巴斯克语、巴西语、保加利亚语、加泰罗尼亚语、中文、捷克语、丹麦、荷兰语、英语、芬兰语、法语、加里西亚语、德语、希腊语、北印度语、匈牙利语、印度尼西亚、爱尔兰语、意大利语、日语、韩国语、库尔德语、挪威语、波斯语、葡萄牙语、罗马尼亚语、俄语、西班牙语、瑞典语、土耳其语和泰语。
我们可以指定其中之一的语言来指定特定的语言分析器,但必须是小写的名字!如果你要分析的语言不在上述集合中,可能还需要搭配相应的插件支持。
8.雪球分析器:snowball analyzer (不推荐用)
雪球分析器(snowball analyzer)除了使用标准的分词和分词过滤器(和标准分析器一样)也是用了小写分词过滤器和停用词过滤器,除此之外,它还是用了雪球词干器对文本进行词干提取。
内置字符过滤器 char_filter
1.HTML字符过滤器:HTML Strip Char Filter
HTML字符过滤器(HTML Strip Char Filter)从文本中去除HTML元素。
2.映射字符过滤器:Mapping Char Filter
映射字符过滤器(Mapping Char Filter)接收键值的映射,每当遇到与键相同的字符串时,它就用该键关联的值替换它们。
"char_filter":{ "my_char_filter":{ "type":"mapping", "mappings":["aaa => 666","bbb => 888"] } }
3.模式替换过滤器:Pattern Replace Char Filter
模式替换过滤器(Pattern Replace Char Filter)使用正则表达式匹配并替换字符串中的字符。 慎用(复杂的正则会影响效率)!
内置分词器 tokenizer
1.标准分词器:standard tokenizer
标准分词器(standard tokenizer)是一个基于语法的分词器,对于大多数欧洲语言来说还是不错的,它同时还处理了Unicode文本的分词,但分词默认的最大长度是255字节,它也移除了逗号和句号这样的标点符号。
2.关键词分词器:keyword tokenizer
关键词分词器(keyword tokenizer)是一种简单的分词器,将整个文本作为单个的分词,提供给分词过滤器。简单的说,就是不分词
3.字母分词器:letter tokenizer
字母分词器(letter tokenizer)根据非字母的符号,将文本切分成分词。
4.小写分词器:lowercase tokenizer
小写分词器(lowercase tokenizer)结合了常规的字母分词器和小写分词过滤器的行为(将所有的分词转化为小写)。通过一个单独的分词器来实现的主要原因是,一次进行两项操作会获得更好的性能。
5.空白分词器:whitespace tokenizer
空白分词器(whitespace tokenizer)通过空白来分隔不同的分词,空白包括空格、制表符、换行等。但是,我们需要注意的是,空白分词器不会删除任何标点符号。
6.模式分词器:pattern tokenizer
模式分词器(pattern tokenizer)允许指定一个任意的模式,将文本切分为分词。
7.UAX URL电子邮件分词器:UAX RUL email tokenizer
UAX URL电子邮件分词器(UAX RUL email tokenizer)能将电子邮件和URL都作为单独的分词进行保留。
8.路径层次分词器:path hierarchy tokenizer
路径层次分词器(path hierarchy tokenizer)允许以特定的方式索引文件系统的路径,这样在搜索时,共享同样路径的文件将被作为结果返回。
内置分词过滤器 filter
太多了,只列出常用的几个
1.长度标记过滤器(Length Token Filter)会移除分词流中太长或者太短的标记,它是可配置的,我们可以在settings中设置。
#过滤掉长度大于8和小于2的分词。 "filter": { "my_test_length":{ "type":"length", "max":8, "min":2 } }
2.小写分词过滤器(Lowercase Token Filter)将分词规范化为小写,它通过language参数支持希腊语、爱尔兰语和土耳其语小写标记过滤器。
#小写分词过滤器,过滤希腊文 "filter": { "greek_lowercase": { "type": "lowercase", "language": "greek" }
3.大写分词过滤器(Uppercase Token Filter)将分词规范为大写。
4.同义词(Synonym Token Filter) 处理同义词
"filter" : { "synonym" : { "type" : "synonym", "synonyms_path" : "analysis/synonym.txt" } }
转载请注明出处