网站首页 文章专栏 elasticsearch学习(五)----分析器

elasticsearch学习(五)----分析器

编辑时间:2019-09-03 13:53:57 作者:苹果 浏览量:255







分析(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"
                            }
                        }



    出自:何冰华个人网站

    地址:http://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论