当在搜索操作期间处理查询时,任何索引中的内容由分析模块分析。 该模块由分析器,分词器,分词器过滤器和字符过滤器组成。 如果没有定义分析器,则默认情况下注册内置的分析器,分词器,分词器过滤器和字符过滤器到分析模块。例如
POST ` http://localhost:9200/index_1 `
# 请求参数
{
"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
}
}
}
}
}
一、分析器
分析器 描述 standard analyze 标准分析器:elasticsearch的默认分析器,该分析器综合了大多数欧洲语言来说合理的默认模块,包括标准分词器、标准分词过滤器、小写转换分词过滤器和停用词分词过滤器。 simple analyzer 简单分析器:简单分析器(simple analyzer):仅使用了小写转换分词,这意味着在非字母处进行分词,并将分词自动转换为小写。这个分词器对于亚种语言来说效果不佳,因为亚洲语言不是根据空白来分词的,所以一般用于欧洲言中 whitespace analyzer 空白(格)分析器(whitespace analyzer):根据空白将文本切分为若干分词 stop analyzer 停用词分析(stop analyzer)和简单分析器的行为很像,只是在分词流中额外的过滤了停用词 keyword analyzer 关键词分析器(keyword analyzer)将整个字段当做单独的分词,如无必要,我们不在映射中使用关键词分析器 pattern analyzer 模式分析器(pattern analyzer)允许我们指定一个分词切分模式。但是通常更佳的方案是使用定制的分析器,组合现有的模式分词器和所需要的分词过滤器更加合适 语言和多语言分析器 我们可以指定其中之一的语言来指定特定的语言分析器,但必须是小写的名字!如果你要分析的语言不在上述集合中,可能还需要搭配相应的插件支持:chinese、french snowball analyzer 雪球分析器(snowball analyzer)除了使用标准的分词和分词过滤器(和标准分析器一样)也是用了小写分词过滤器和停用词过滤器,除此之外,它还是用了雪球词干器对文本进行词干提取
# 标准分析器示例
POST `http://localhost:9200/_analyze`
# 请求参数
{
"analyzer" : "standard" ,
"text" : "To be or not to be, That is a question ———— 莎士比亚"
}
二、字符过滤器
字符过滤器在属性中定义,它是对字符流进行处理。字符过滤器种类不多。elasticearch只提供了三种字符过滤器: HTML字符过滤器(HTML Strip Char Filter) 映射字符过滤器(Mapping Char Filter) 模式替换过滤器(Pattern Replace Char Filter)
# HTML 字符过滤器示例
POST ` http://localhost:9200/_analyze `
# 请求参数
{
"tokenizer" : "keyword" ,
"char_filter" : [ "html_strip" ] ,
"text" : "<p>I'm so <b>happy</b>!</p>"
}
过滤器 描述 HTML字符过滤器 HTML字符过滤器(HTML Strip Char Filter)从文本中去除HTML元素 映射字符过滤器 映射字符过滤器(Mapping Char Filter)接收键值的映射,每当遇到与键相同的字符串时,它就用该键关联的值替换它们 模式替换过滤器 模式替换过滤器(Pattern Replace Char Filter)使用正则表达式匹配并替换字符串中的字符。但要小心你写的抠脚的正则表达式。因为这可能导致性能变慢!
三、分词器
分词器 standard tokenizer 标准分词器(standard tokenizer)是一个基于语法的分词器,对于大多数欧洲语言来说还是不错的,它同时还处理了Unicode文本的分词,但分词默认的最大长度是255字节,它也移除了逗号和句号这样的标点符号 keyword tokenizer 关键词分词器(keyword tokenizer)是一种简单的分词器,将整个文本作为单个的分词,提供给分词过滤器,当你只想用分词过滤器,而不做分词操作时,它是不错的选择 letter tokenizer 字母分词器(letter tokenizer)根据非字母的符号,将文本切分成分词 lowercase tokenizer 小写分词器(lowercase tokenizer)结合了常规的字母分词器和小写分词过滤器(跟你想的一样,就是将所有的分词转化为小写)的行为。通过一个单独的分词器来实现的主要原因是,一次进行两项操作会获得更好的性能 whitespace tokenizer 空白分词器(whitespace tokenizer)通过空白来分隔不同的分词,空白包括空格、制表符、换行等。但是,我们需要注意的是,空白分词器不会删除任何标点符号 pattern tokenizer 模式分词器(pattern tokenizer)允许指定一个任意的模式,将文本切分为分词 UAX RUL email tokenizer UAX URL电子邮件分词器,该分词器将电子邮件和URL都作为单独的分词进行保留 path hierarchy tokenizer 路径层次分词器(path hierarchy tokenizer)允许以特定的方式索引文件系统的路径,这样在搜索时,共享同样路径的文件将被作为结果返回
# 标准分词器示例
POST ` http://localhost:9200/_analyze `
# 请求参数
{
"tokenizer" : "standard" ,
"text" : "To be or not to be, That is a question ———— 莎士比亚"
}
四、分词过滤器
分词过滤器 描述 标准分词过滤器(Standard Token Filter) 在6.5.0版本弃用。此筛选器已被弃用,将在下一个主要版本中删除。在之前的版本中其实也没干啥,甚至在更老版本的Lucene中,它用于去除单词结尾的s字符,还有不必要的句点字符,但是现在, 连这些小功能都被其他的分词器和分词过滤器顺手干了,真可怜! ASCII折叠分词过滤器(ASCII Folding Token Filter) 将前127个ASCII字符(基本拉丁语的Unicode块)中不包含的字母、数字和符号Unicode字符转换为对应的ASCII字符(如果存在的话)。 扁平图形分词过滤器(Flatten Graph Token Filter) 接受任意图形标记流。例如由同义词图形标记过滤器生成的标记流,并将其展平为适合索引的单个线性标记链。这是一个有损的过程,因为单独的侧路径被压扁在彼此之上,但是如果在索引期间使用图形令牌流是必要的,因为Lucene索引当前不能表示图形。 出于这个原因,最好只在搜索时应用图形分析器,因为这样可以保留完整的图形结构,并为邻近查询提供正确的匹配。该功能在Lucene中为实验性功能。 长度标记过滤器(Length Token Filter) 会移除分词流中太长或者太短的标记,它是可配置的,我们可以在settings中设置。 小写分词过滤器(Lowercase Token Filter) 将分词规范化为小写,它通过language参数支持希腊语、爱尔兰语和土耳其语小写标记过滤器。 大写分词过滤器(Uppercase Token Filter) 将分词规范为大写。
4.1 自定义分词过滤器
# 自定义长度分词过滤器
PUT ` http://localhost:9200/index_1 `
{
"settings" : {
"analysis" : {
"filter" : {
"my_test_length" : {
"type" : "length" ,
"max" : 8 ,
"min" : 2
}
}
}
}
}
# 使用
POST ` http://localhost:9200/index_1/_analyze `
{
"tokenizer" : "standard" ,
"filter" : [ "my_test_length" ] ,
"text" : "a Small word and a longerword"
}