Elasticsearch 所有内置分词器介绍(6)

一.概述

  Tokenizer分词器接收字符流(es的text类型),将其分解为单个term(通常是单个单词), 然后输出标记流。分词器除了分解,还负责记录以下内容:

    1)记录每个单词(term)的顺序或位置(用于”phrase短语“和单词邻近性查询)

    2)term原始单词的开始和结束字符偏移量(使用 ”highlighting 高亮“ 搜索显示)

    3)token类型,生成每个term的分类。例如:字母、数字。

  Elasticsearch有许多内置的Tokenizer,可用于构建自定义的Tokenizer。Tokenizer有三种分类:

    1)面向单词的分词器,这种分析器是将文本拆分为一个个的单词。

    2)部分单词的分词器,这种分析器是将文本拆分为任意组合的字母(通过配置1~n个)。

    3)结构化文本的分词器,该类型分词器通常与结构化文本一起使用,例如:邮件地址、邮政编码。

  分析器与分词器关系总结:

    前面章节有讲到一个分析器的组合包含:一个Tokenizer分词器(必需),0或多个charactcr filter、 0或多个token filter。

    对于Elasticsearch内置的许多分析器和分词器,二者的名称许多都一样。如: Standard分析器和Standard分词器,它们之间的关系是Standard分析器包含了一个Standard分词器。

    对于分析器与分词器,可以直接使用内置的,也都可以是创建自定义的。

二. 面向单词的分词器  

  2.1 Standard Tokenizerc(标准分词器)

    Standard分析器包含了Standard 分词器,这里不再举例,参考:Elasticsearch 所有内置分析器介绍(5) 

  2.2 Letter Tokenizer(字母分词器)

    分词规则是:遇到字符时(如空格、下划线等)拆分。合适欧洲语言,但对于一些亚洲语言来说单词是不用空格分隔。

POST _analyze
{
  "tokenizer": "letter",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

    分词结果:[ The, QUICK, Brown, Foxes, jumped, over, the, lazy, dog, s, bone ]

  2.3 Lowercase Tokenizer(小写分词器)

    分词规则与Letter Tokenizer相似,再转为小写的分词。功能上是 Letter Tokenizer与小写的token filter相结合,但它的效益更高。

POST _analyze
{
  "tokenizer": "lowercase",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

    分词结果:[ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ]

  2.4 Whitespace Tokenizer (空白分词器)

    Whitespace 分析器包含了Whitespace 分词器,这里不再举例,参考:Elasticsearch 所有内置分析器介绍(5) 

  2.5 uax_url_email  Tokenizer

    该分析器与Standard分析器相似,只不过它将url和电子邮件识别为单个term。

POST _analyze
{
  "tokenizer": "uax_url_email",
  "text": "Email me at john.smith@global-international.com"
}

    分词结果:[ Email, me, at, john.smith@global-international.com ]

  2.6 Classic Tokenizer(经典分词器)

    经典分词器是基于语法的分词器,适应于英语文档。该分析器有以下特点:

      1)根据标点符号拆分单词,并删除标点符号。

      2)根据字符拆分的单词,如字符:中划线 -  

      3)它将电子邮件地址和互联网主机名识别为一个term。

POST _analyze
{
  "tokenizer": "classic",
  "text": "john.smith@global-international.com The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

    分词结果:[ john.smith@global-international.com, The, 2, QUICK, Brown, Foxes, jumped, over, the, lazy, dog's, bone ]

    该分词器接受一个参数,max_token_length最大令牌长度。如果令牌超过此长度,则按max_token_length间隔进行拆分。默认值 255

    下面是配置max_token_length长度为5的示例:

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "classic",
          "max_token_length": 5
        }
      }
    }
  }
}
POST my-index-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "The 2 QUICK Brown-Foxes jumped over the lazy dog's bone."
}

    分词结果:[ The, 2, QUICK, Brown, Foxes,  over, the, lazy, dog's, bone ]  丢失了jumped单词,长度为6

三.部分单词的分词器

  3.1 N-Gram Tokenizer

  3.2 Edge N-Gram Tokenizer

    二种分词器比较常用,将再下一篇单独篇讲。

四.结构化文本的分词器

  4.1 Keyword Tokenizer  (关键字分词器)

    Keyword 分析器包含了Keyword 分词器,这里不再举例,参考:Elasticsearch 所有内置分析器介绍(5) 

  4.2 Pattern Tokenizer  (模式分词器)

    Pattern 分析器包含了Pattern 分词器,这里不再举例,参考:Elasticsearch 所有内置分析器介绍(5) 

  4.3 Simple Pattern Tokenizer (简单模式分词器)

    simple_pattern  简单模式分词器使用Lucene正则表达式,简单模式分词器对比模式分词器功能有限,但通常比模式分词器分词更快。

    自定义一个简单模式分析,将文本拆分为3位数字的词

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "simple_pattern",
          "pattern": "[0123456789]{3}"
        }
      }
    }
  }
}
POST my-index-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "fd-786-335-514-x"
}

    分词结果:[ 786, 335, 514 ]   

    将文本中拆分为3个数字为一个词,如果文本是:fd-1786-335-514-x   分词结果:[ 178, 335, 514 

  4.4 Char Group Tokenizer 

    char_group 分词器可通过要分割的字符进行配置,这通常比运行正则表达式性能更好。

POST _analyze
{
  "tokenizer": {
    "type": "char_group",
    "tokenize_on_chars": [
      "whitespace",
      "-",
      "\n"
    ]
  },
  "text": "The QUICK brown-fox"
}

     分词结果:[The,QUICK,brown,fox ]

  4.5 Simple Pattern Split Tokenizer (简单模式拆分 分词器)

    simple_pattern_split  简单模式拆分分词器使用Lucene正则表达式,对比模式分词器功能有限,但通常比模式分词器分词更快。

    自定义一个简单模式拆分分词器,将文本以  _  下划线来拆分

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "simple_pattern_split",
          "pattern": "_"
        }
      }
    }
  }
}
POST my-index-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "fd_786_335_514_x"
}

    分词结果:[ fd,786, 335, 514,x ]    

  4.6 Path Tokenizer  (路径分词器)

     path_hierarchy 分词器,将文本以路径分隔符进行分割 ,该分词器接收以下重要参数:

    1) delimiter   设置分隔符字符。默认值为  /

    2) replacement 设置替换字符,默认为delimiter 

    3)skip :跳过令牌的数量。默认为0

    自定义一个路径分析器

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "path_hierarchy",
          "delimiter": "-",
          "replacement": "/",
          "skip": 2
        }
      }
    }
  }
}
POST my-index-000001/_analyze
{
  "analyzer": "my_analyzer",
  "text": "one-two-three-four-five"
}

    分词结果:[/three, /three/four, /three/four/five]  使用skip跳过了前面二个令牌

 参考官方资料: Tokenizer reference

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值