ElasticSearch 基础(七)之分析器

这篇具有很好参考价值的文章主要介绍了ElasticSearch 基础(七)之分析器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

就 ES 基础部分来说这暂时就是最后一篇的文章,写完之后就会学习 MQ 了。本篇内容简单了解 ES 的分析器,最重要的还是根据自己需求去定制自定义分析器,自定义分析器自行了解,这里只是基础。其他比较重要的就是中文分词器了,只需要知道常用的几种中文分词器就可以了。

一、什么是分析器(analyzer)

无论是内置的分析器,还是自定义的分析器,都是由一个分词器(tokenizers) 、0或多个词项过滤器(token filters)、0或多个字符过滤器(character filters)组成。

ElasticSearch 基础(七)之分析器

  • 分词器(tokenizer):用于定义切词 (分词)逻辑。
  • 词项过滤器(token tilter):用于对分词之后的单个词项的处理逻辑。
  • 字符过滤器(character filter):用于处理单个字符。

在实际使用中我们大多数听到的都是分词器,原本是因为过滤器用到的很少,所以在叫法上几乎分析器等价于分词器了。而且分词的结果经常与高亮结合使用。

  • 在ElasticSearch引擎中,分析器的任务是 分析(analyze) 文本数据,分析是分词,规范化文本的意思,其工作流程是:

    • 首先,字符过滤器对 分析(analyzed) 文本进行过滤和处理,例如:从原始文本中移除HTML标记,根据字符映射替换文本等。
    • 过滤之后的文本被分词器接收,分词器把文本分割成标记流,也就是一个接一个的标记。
    • 标记过滤器对标记流进行过滤处理,例如:移除停用词,把词转换成其词干形式,把词转换成其同义词等。
    • 过滤之后的标记流被存储在倒排索引中。
  • ElasticSearch引擎在收到用户的查询请求时,会使用分析器对查询条件进行分析,根据分析的结构,重新构造查询,以搜索倒排索引,完成全文搜索请求,

分析器的处理过程发生在 创建倒排索引时搜索时 两个时期,创建和搜索时使用的分词器规则一致,才可以搜索到准确的数据。

二、字符过滤器(character filter)

Elasticsearch 有许多内置的字符过滤器,可用于构建自定义分析器。

参考:Elasticsearch:分析器中的 character filter 介绍

1、html strip 字符过滤器

html_strip 字符过滤器去除像 <b> 这样的 HTML 元素并解码成像 & 这样的 HTML 实体。

POST _analyze
{
  "text":"<h1>Where is my cheese?</h1>",
  "tokenizer": "standard", 
  "char_filter": ["html_strip"]
}
//返回:
{
  "tokens": [
    {
      "token": "Where",
      "start_offset": 4,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "is",
      "start_offset": 10,
      "end_offset": 12,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "my",
      "start_offset": 13,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "cheese",
      "start_offset": 16,
      "end_offset": 22,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

字符过滤器只是从输入字段中剥离 <h1> 标签,但是有时候一些标签需要保留,例如:业务需求可能是从句子中去除 <h1> 标签,但保留预格式化 (<pre>) 标签;这时候就需要使用所需的自定义分析器去创建索引。

PUT <index>
{
  "settings": {
    "analysis": {
      "analyzer": {									# 这这里设置分析器
        "ANALYZER_NAME":{							# 分析器名
          "tokenizer":"TOKENIZER", 					# 设置分词器
          "char_filter":["CHAR_FILTER_NAME"]		# 设置过滤器
        }
      },
      "char_filter": {								# 这里设置过滤器
        "CHAR_FILTER_NAME":{						# 过滤器名
          "type":"FILTER",							# 设置过滤器类型
          "escaped_tags":["html标签","pre","br", "...."] # 需要保留的标签
        }
      }
    }
  }
}

2、mapping 字符过滤器

mapping 字符过滤器用指定的替换替换任何出现的指定字符串。

POST _analyze
{
  "text": "I am from CN",
  "char_filter": [
    {
      "type": "mapping",
      "mappings": [
        "CN => 中国"
      ]
    }
  ]
}
//返回:
{
  "tokens": [
    {
      "token": "I am from 中国",
      "start_offset": 0,
      "end_offset": 12,
      "type": "word",
      "position": 0
    }
  ]
}

自定义分析器创建索引:

PUT <index>
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ANALYZER_NAME": { 						# 分析器名
          "tokenizer": "TOKENIZER",				# 选择分词器
          "char_filter": [						# 选择过滤器
            "CHAR_FILTER_NAME" 			
          ]
        }
      },
      "char_filter": {
        "CHAR_FILTER_NAME": { 					# 过滤器名
          "type": "FILTER",						# 设置过滤器类型
          "mappings": [ 						# 替换配置
            ...
          ]
        }
      }
    }
  }
}

3、patter replace 字符过滤器

pattern_replace 字符过滤器用指定的字符替换与正则表达式匹配的任何字符。

PUT <index>
{
  "settings": {
    "analysis": {
      "analyzer": {
        "ANALYZER_NAME":{ 
          "tokenizer":"keyword",
          "char_filter":["CHAR_FILTER_NAME"] 
        }
      },
      "char_filter": { 
        "CHAR_FILTER_NAME":{ 
          "type":"FILTER", 
          "pattern":"被替换字符", 
          "replacement":"替换后的字符" 
        }
      }
    }
  }
}

三、分词器(tokenizers)

分词器(tokenizers)是对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项(term),粒度大小取决于分词器规则。

设置分词器:

PUT /<index>
{
  "settings": {}, # 可在 analysis 下设置自定义分词器
  "mappings": {
    "properties": {
      "FIELD_NAME":{
        "type": "text",
        "analyzer": "standard|letter|whitespace|lowercase|..." 	# 指定分词器
      }
    }
  }
}

下面简单介绍几个常用的系统默认分词器:

1、standard tokenizer(标准分词器)

标准分词器类型是 standard,用于大多数欧洲语言,使用 unicode文本分割算法 对文档进行分词。

//测试:
GET /_analyze
{
  "tokenizer" : "standard",
  "text" : "I am from CN"
}
//分词结果:
{
  "tokens": [
    {
      "token": "I",
      "start_offset": 0,
      "end_offset": 1,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "am",
      "start_offset": 2,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "from",
      "start_offset": 5,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "CN",
      "start_offset": 10,
      "end_offset": 12,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

2、letter tokenizer(字母分词器)

字符分词器类型是 letter,在非字母位置上分割文本,这就是说,根据相邻的词之间是否存在非字母(例如空格,逗号等)的字符,对文本进行分词,对大多数欧洲语言非常有用。

//测试:
GET /_analyze
{
  "tokenizer" : "letter",
  "text" : "I'm from CN"
}
//分词结果:
{
  "tokens": [
    {
      "token": "I",
      "start_offset": 0,
      "end_offset": 1,
      "type": "word",
      "position": 0
    },
    {
      "token": "m",
      "start_offset": 2,
      "end_offset": 3,
      "type": "word",
      "position": 1
    },
    {
      "token": "from",
      "start_offset": 4,
      "end_offset": 8,
      "type": "word",
      "position": 2
    },
    {
      "token": "CN",
      "start_offset": 9,
      "end_offset": 11,
      "type": "word",
      "position": 3
    }
  ]
}

3、whitespace tokenizer(空格分词器)

空格分词类型是 whitespace,在空格处分割文本。

GET /_analyze
{
  "tokenizer" : "whitespace",
  "text" : "I'm from CN"
}
//分词结果:
{
  "tokens": [
    {
      "token": "I'm",
      "start_offset": 0,
      "end_offset": 3,
      "type": "word",
      "position": 0
    },
    {
      "token": "from",
      "start_offset": 4,
      "end_offset": 8,
      "type": "word",
      "position": 1
    },
    {
      "token": "CN",
      "start_offset": 9,
      "end_offset": 11,
      "type": "word",
      "position": 2
    }
  ]
}

4、lowercase tokenizer(小写分词器)

小写分词器类型是 lowercase,在非字母位置上分割文本,并把分词转换为小写形式,功能上是 letter tokenizerlower case token filter 的结合,但是性能更高,一次性完成两个任务。

GET /_analyze
{
  "tokenizer" : "lowercase",
  "text" : "I'm from CN"
}
//分词结果:
{
  "tokens": [
    {
      "token": "i",
      "start_offset": 0,
      "end_offset": 1,
      "type": "word",
      "position": 0
    },
    {
      "token": "m",
      "start_offset": 2,
      "end_offset": 3,
      "type": "word",
      "position": 1
    },
    {
      "token": "from",
      "start_offset": 4,
      "end_offset": 8,
      "type": "word",
      "position": 2
    },
    {
      "token": "cn",
      "start_offset": 9,
      "end_offset": 11,
      "type": "word",
      "position": 3
    }
  ]
}

5、classic tokenizer(经典分词器)

经典分词器类型是 classic ,基于语法规则对文本进行分词,对英语文档分词非常有用,在处理首字母缩写,公司名称,邮件地址和Internet主机名上效果非常好。

GET /_analyze
{
  "tokenizer" : "classic",
  "text" : "I'm from CN"
}
// 分词结果:
{
  "tokens": [
    {
      "token": "I'm",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<APOSTROPHE>",
      "position": 0
    },
    {
      "token": "from",
      "start_offset": 4,
      "end_offset": 8,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "CN",
      "start_offset": 9,
      "end_offset": 11,
      "type": "<ALPHANUM>",
      "position": 2
    }
  ]
}

6、其他分词器

等其它多种分词器,这里不再一一列出,因为不是经常用的。

其它分词器参考官网:Tokenizer。

四、词项过滤器(token filter)

1、ASCII folding token filter(ASCII折叠分词过滤器)

将不在 Basic Latin Unicode 块中的字母、数字和符号字符(前 127 个 ASCII 字符)转换为它们的 ASCII 等效字符(如果存在)。 例如,过滤器将 à 更改为 a。

GET /_analyze
{
  "tokenizer" : "standard",
  "filter" : ["asciifolding"],
  "text" : "açaí à la carte"
}
//返回:
{
  "tokens": [
    {
      "token": "acai",
      "start_offset": 0,
      "end_offset": 4,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "a",
      "start_offset": 5,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "la",
      "start_offset": 7,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "carte",
      "start_offset": 10,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

2、length token filter(长度标记过滤器)

删除比指定字符长度更短或更长的标记,它是可配置的,我们可以在settings中设置。 例如,你可以使用长度过滤器来排除短于 2 个字符的标记和长于 5 个字符的标记。

GET _analyze
{
  "tokenizer": "whitespace",
  "filter": [
    {
      "type": "length",
      "min": 0,
      "max": 4
    }
  ],
  "text": "the quick brown fox jumps over the lazy dog"
}
//返回:
{
  "tokens": [
    {
      "token": "the",
      "start_offset": 0,
      "end_offset": 3,
      "type": "word",
      "position": 0
    },
    {
      "token": "fox",
      "start_offset": 16,
      "end_offset": 19,
      "type": "word",
      "position": 3
    },
    {
      "token": "over",
      "start_offset": 26,
      "end_offset": 30,
      "type": "word",
      "position": 5
    },
    {
      "token": "the",
      "start_offset": 31,
      "end_offset": 34,
      "type": "word",
      "position": 6
    },
    {
      "token": "lazy",
      "start_offset": 35,
      "end_offset": 39,
      "type": "word",
      "position": 7
    },
    {
      "token": "dog",
      "start_offset": 40,
      "end_offset": 43,
      "type": "word",
      "position": 8
    }
  ]
}

3、lowercase token filter(小写分词过滤器)

将分词规范化为小写,它通过language参数支持希腊语、爱尔兰语和土耳其语小写标记过滤器。

GET _analyze
{
  "tokenizer" : "standard",
  "filter" : ["lowercase"],
  "text" : "THE Quick FoX JUMPs"
}
//返回:
{
  "tokens": [
    {
      "token": "the",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "quick",
      "start_offset": 4,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "fox",
      "start_offset": 10,
      "end_offset": 13,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "jumps",
      "start_offset": 14,
      "end_offset": 19,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

4、uppercase token filter(大写分词过滤器)

将分词规范为大写。

GET _analyze
{
  "tokenizer" : "standard",
  "filter" : ["uppercase"],
  "text" : "the Quick FoX JUMPs"
}
//返回:
{
  "tokens": [
    {
      "token": "THE",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "QUICK",
      "start_offset": 4,
      "end_offset": 9,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "FOX",
      "start_offset": 10,
      "end_offset": 13,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "JUMPS",
      "start_offset": 14,
      "end_offset": 19,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

5、其他词项过滤器

其余分词过滤器不一一列举。详情参见 官网。

五、中文分词器

中文分词器主要介绍 IK 分词器拼音分词器

1、ik分词器 - 常用

安装参考:Elasticsearch:IK 中文分词器。

IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。

  • 采用了特有的“正向迭代最细粒度切分算法“,支持细粒度和最大词长两种切分模式;
  • 具有83万字/秒(1600KB/S)的高速处理能力。
  • 采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符优化的词典存储,更小的内存占用。
  • 支持用户词典扩展定义,针对Lucene全文检索优化的查询分析器 IKQueryParser;
  • 引入简单搜索表达式,采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。


ik 的分词粒度:

  • ik_max_word:会将文本做较细粒度的拆分,例如「我爱北京天安门」会被拆分为「我、爱、北京、天安门、天安、门」,会穷尽各种可能的组合。
  • ik_smart:会将文本做简单粗粒度的拆分,例如「我爱北京天安门」会被拆分为「我、爱、北京、天安门」。
GET /_analyze
{
  "analyzer" : "ik_max_word|ik_smart",
  "text" : "我爱北京天安门"
}

2、拼音分词器

安装使用参考:Elasticsearch:Pinyin 分词器。

拼音分词器可以让用户输入拼音,就能查找到相关的关键词。比如在某个商城搜索中,输入yonghui,就能匹配到永辉。

3、简体繁体转换分词器

安装使用参考:Elasticsearch:简体繁体转换分词器 - STConvert analysis。文章来源地址https://www.toymoban.com/news/detail-490240.html

到了这里,关于ElasticSearch 基础(七)之分析器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch系列 - SpringBoot整合ES:ElasticSearch分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2023年04月18日
    浏览(124)
  • Elasticsearch 分词器切词器分析器

    normalization : 文档规范化 先切词,然后规范化. 规范化要规范哪些内容? 大小写; 标点符号; 时态; 复数; 规范化主要是为了匹配更精准 character filter : 字符过滤器. 标点符号 分词之前的预处理,过滤无用字符 HTML Strip Character Filter :html_strip 参数:escaped_tags 需要保留的html标签 Map

    2024年02月12日
    浏览(38)
  • ElasticSearch系列 - SpringBoot整合ES:分析器

    1. ElasticSearch match 文本搜索的过程? Elasticsearch 的 match 查询是一种基于文本匹配的查询方式,它的搜索过程如下: ① 将查询字符串分词:Elasticsearch 会将查询字符串分成一个个词项(term),并去除停用词(如“的”、“是”等常用词汇)和标点符号等无意义的字符。 ② 构建

    2024年02月06日
    浏览(59)
  • Elasticsearch:Standard Text Analyzer - 标准文本分析器

    Elasticsearch 提供了超过很多开箱即用的分析器,我们可以在文本分析阶段使用它们。 这些分析器很可能足以满足基本情况,但如果需要创建自定义分析器,可以通过使用构成该模块的所需组件实例化一个新的分析器模块来实现。 下表列出了 Elasticsearch 为我们提供的分析器:

    2023年04月26日
    浏览(99)
  • Elasticsearch (ES) 搜索引擎: 文本搜索:分析器/分词器、同义词/停用词、拼音搜索、高亮显示、拼写纠错

    原文链接:https://xiets.blog.csdn.net/article/details/132349032 版权声明:原创文章禁止转载 专栏目录:Elasticsearch 专栏(总目录) 文本搜索主要指的就是全文搜索,全文搜索是搜索引擎的核心功能,与精确匹配的结构化数据不同,文本(text)数据在构建索引和搜索时都需要进行额外的处

    2024年02月03日
    浏览(58)
  • 词法分析器(c++)

    个人觉得单纯是用来完成实验报告的话还行,但仅做参考,因为本人的编程水平有限,怕误人子弟。 本次代码支持以下操作: 单行注释 多行注释 文件形式输入 种别码可以在文件中自由修改 单词字符串识别支持: 部分(可手动在程序外部---reference.txt文件添加,),

    2024年02月04日
    浏览(48)
  • 编译原理———词法分析器

    设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。其中,  syn为单词种别码。  Token为存放的单词自身字符串。  Sum为整型常量。 具体实现时,可以将单词的二

    2024年02月08日
    浏览(61)
  • 分析器:常见问题

    源生成器(增量生成器)由于它特殊的定位,关于它的调试十分困难。在这里分享一些调试它的经验。 另外经常有写类库,然后提供可以生成代码的Attribute给用户的需求,此时需要用到传递引用的知识点。 源生成器项目和普通的项目不同。 普通的会在你按下运行或调试后才

    2024年02月01日
    浏览(67)
  • 词法分析器的设计与实现

    1.1、实验目的         加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 1.2、实验要求         1)对单词的构词规则有明确的定义;      

    2024年02月13日
    浏览(52)
  • Lex 生成一个词法分析器

     lex 通过输入一个.l 文件生成一个lex.yy.c 文件,然后通过c 编译器编译成一个可执行的词法分析器。 该词法分析器扫描输入源文件,生成一个token 符号流给后面语法分析器使用。   .l 文件的结构, 分成三个部分,声明, 转换规则, 自定义规则。 三个部分由%%分割 声明段,

    2024年02月19日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包