首页 > 其他分享 >Elasticsearch 所有内置分词器介绍(6)

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

时间:2024-04-24 10:57:45浏览次数:24  
标签:内置 tokenizer Tokenizer 分析器 analyzer Elasticsearch 分词器 my

一.概述

  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 [email protected]"
}

    分词结果:[ Email, me, at, [email protected] ]

  2.6 Classic Tokenizer(经典分词器)

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

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

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

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

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

    分词结果:[ [email protected], 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

标签:内置,tokenizer,Tokenizer,分析器,analyzer,Elasticsearch,分词器,my
From: https://www.cnblogs.com/MrHSR/p/18113230

相关文章

  • docker-compose 安装部署ElasticSearch 和 Kibana
    项目需要搭建es环境,踩了一些坑,记录下首选还是通过docker搭建,而通过docker最佳的部署方式就是dockercompose1.docker-compose.ymlversion:"3.1"#服务配置services:elasticsearch:container_name:es01image:elasticsearch:8.12.2restart:unless-stopp......
  • AP2915 是一款可以一路灯串切换两路灯串的降压恒流驱动器,高效率、外围简单、内置功率
    产品概述:AP8852是一款内部集成有功率MOSFET管的降压型开关稳压器。以电流模式控制方式达到快速环路响应并提高环路的稳定性。宽范围输入电压(4.5V至60V)提供0.5A电流的高效率输出,可在移动环境输入的条件下实现各种降压型电源变换的应用。0.1uA的关机静态电流适合电池供电场合的应......
  • python 常用内置函数
    len()len(iterable):返回给定序列(可迭代对象)的长度或元素个数。list1=[1,2,3,4,5]print("列表长度:",len(list1))issubclass()issubclass(class,classinfo):检查一个类是否是另一个类的子类,返回True或False。classBase:passclassDerived(Base):pass......
  • 前端【uniapp】02-uniapp【全局文件】【组件【内置、扩展】】【声明周期】【API调用】
    一、uni-app基础知识uni-app是组合了Vue和微信小程序的相关技术知识,要求大家同时俱备Vue和原生小程序的开发基础。1、全局文件在小程序中有全局样式、全局配置等全局性的设置,为此在uni-app中也有一些与之相对应的全局性的文件。uni.scssuni-app项目在运......
  • docker安装elasticsearch和kibana
    来源:https://www.cnblogs.com/baoshu/p/16128127.html安装目标使用docker安装elasticsearch和kibana,版本均为7.17.1安装es1.dockerpull#去dockerhub看具体版本,这里用7.17.1Copydockerpullelasticsearch:7.17.1dockerpullkibana:7.17.12.临时安装生成文件#Copy......
  • ElasticSearch 7.17.20本地源码调试
    目录使用本地安装gradle下载相关依赖本地编译本地调试使用本地安装gradle下载相关依赖在gradle安装目录下的init.d目录中,创建初始化脚本init.gradle,添加如下脚本,将其中的maven仓库源全部换成国内镜像allprojects{repositories{defREPOSITORY_URL='http://m......
  • 第27天:安全开发-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞 - Shortcut
     https://www.kancloud.cn/manual/thinkphp5_1/354000ThinkPHP-Vuln-master ......
  • 分词器tokenizers
    总览为了让语言变为模型能够理解的形式(tokens),每个字词必须映射为独一无二的序号,这时需要使用分词器tokenizer对语言进行转换。例如对于“areyouok”,gemma模型的tokenizer会将之转换为一个List:[2,895,692,4634]。顺便一提,第一个序号2是开始标记<bos>。本文是学......
  • SpringCloud(七.7)ES(elasticsearch)-- 实战练习
    demo地址:链接:https://pan.baidu.com/s/16c1mMcQv7bF3Fcz2X_PE7A  提取码:msvy库表tb_hotel.sql: 链接:https://pan.baidu.com/s/1wVdh-fZoyeNbLUkyQYCD5g  提取码:3t4y 练习目标一:实现酒店搜索功能,完成关键字搜索和分页功能 如图,点击搜索按钮,我们发现它调用的是hot......
  • Elasticsearch 所有内置分析器介绍(5)
     Elasticsearch 附带了各种内置分析器,可以直接在任何索引中使用,而无需额外配置:1)标准分析器  StandardAnalyzer该分析器的文本分词规则是:过滤掉大多数标点符号来划分单词,通过Unicode文本分割算法,再转成小写的分词。支持删除常用的停用词(如:the,a......