ElasticSearch中常见的分词器介绍

文章目录

  • ElasticSearch中常见的分词器介绍
    • 前言
    • 分词器的作用
    • 如何指定分词器
    • 分词器的组成
    • 分词器的类型
      • 标准分词器
      • 空格分词器
      • 简单分词器
      • 关键词分词器
      • 停用词分词器
      • IK分词器
      • NGram分词器
      • 正则匹配分词器
      • 语言分词器
      • 自定义分词器

ElasticSearch中常见的分词器介绍

前言

ElasticSearch是一个高效的分布式搜索引擎,其中分词器是它的核心组件之一,平常开发中选择一个合适的分词器可以很大程度上提高检索效率,所以特意花点时间快速了解ElasticSearch中各大常见的分词器,本文也将分别介绍ElasticSearch中常见的几大分词器的特点、适用场景,以及如何使用

推荐阅读

  • ElasticSearch快速入门_知识汲取者的博客-CSDN博客

分词器的作用

分词器是在搜索引擎和文本处理中起关键作用的组件,它负责将文本切分成一个个有意义的词语,以建立索引或进行搜索和分析。

上面可能说的有一些太官方了,详细点说就是,ES搜索引擎是根据词条进行检索的,这里的词条相当于MySQL中的索引,是ElasticSearch能实现海量数据高效检索的核心,在MySQL中,如果我们不恰当的建立索引,就会影响数据库的查询性能,比如我们为区分度不大的字段建立索引,SQL优化器评测发现走索引性能和全表扫描的性能差不多,这时候就直接进行全表扫描了,此时索引就一点作用都没有了,同理这个分词也是一样的道理,他都目的也是将一个一句话分成若干个词条,以词条为索引,以此来提高检索的效率和检索的正确性

再举一个实际的例子,比如这里有一句话“他们在商店买了一些苹果手机和一些苹果”,如果我们分词时将苹果手机进行拆分,我们搜索苹果手机,可能无法搜索出带有苹果手机的文档

他们 在 商店 买 一些 苹果 手机 和 一些 苹果

而一下的分词,则可以正确搜索出带有苹果手机的词条

他们 在 商店 买 了 一些 苹果手机 和 一些 苹果
  • 文本切分: 分词器根据一定的规则将文本切分为单个的词语或词汇单元。这个过程通常涉及到处理空格、标点符号、停用词等。
  • 标准化: 分词器可以对词语进行标准化,例如将所有字符转为小写,以实现大小写不敏感的搜索。这有助于提高搜索的准确性。
  • 去除停用词: 分词器通常会去除一些常见的停用词,这些词语在搜索中往往没有实际的意义,例如 “and”, “the”, “is” 等。
  • 词干化: 对于词语的各种形式(如单数和复数、动词的不同时态等),分词器可以将它们转化为同一个基本形式,以提高搜索的准确性。
  • 自定义规则: 分词器允许用户根据具体需求定义自己的切分规则、标准化规则等,以适应特定的搜索场景。
  • 支持多语言: 对于全球化的应用,分词器能够支持多种语言,包括中文、英文、法文等,以确保对不同语言的文本都能有效地进行处理。
  • 支持搜索建议: 通过使用边缘 n-gram 等技术,分词器可以支持搜索建议功能,提供更智能的搜索提示。

如何指定分词器

  • 方式一:创建索引时,通过映射直接指定分词器

    PUT /your_index_name
    {"mappings": {"properties": {"your_field_name": {"type": "text","analyzer": "your_analyzer_name"},// other fields...}}
    }
    
  • Step2:修改索引时,通过修改映射修改分词器

    PUT /your_index_name/_mapping
    {"properties": {"your_field_name": {"type": "text","analyzer": "your_analyzer_name"},// other fields...}
    }
    

注意

  1. 如果不指定分词器,则默认使用标准分词器 standard
  2. 不同的字段可以使用不同的分词器,根据实际需求选择适当的分词策略
  3. ElasticSearch默认自带Standard AnalyzerWhitespace AnalyzerSimple AnalyzerKeyword AnalyzerStop Analyzer等分词器,其它分词器,比如:IK Analyzer需要手动下载

分词器的组成

分词器主要由以下三部分组成

  • Character Filters(字符过滤器):这一步针对原始文本进行预处理,对文本中的字符进行修改或删除。例如,去除 HTML 标签、替换特定字符等。
  • Tokenizer(分词器):分词器将经过字符过滤器处理后的文本切分成一个个的词条,形成一个词条流。切分的规则可以是按空格、标点符号等,或者根据某种特定的算法,比如边缘 n-gram。
  • Token Filters(词汇过滤器):这一步对切分后的词条流进行进一步的处理。可以进行词条的大小写转换、删除停用词(常用但无实际意义的词语)、词干化等操作。词汇过滤器对于调整文本以适应索引和搜索的需求非常重要。

image-20231111161801193

分词器的类型

分词器分词依据特点
Standard Analyzer空格、标点符号小写化处理、过滤符号
Whitespace Analyzer空格不进行小写化处理、保留所有字符
Simple Analyzer非字母(符号、数字)小写化处理、过滤符号、支持中文拼音分词
Keyword Analyzer将整个输入作为一个词条
Stop Analyzer空格小写化处理、过滤停用词
IK Analyzer词典中文分词
Edge NGram Analyzern-gram按指定步长进行分词
Pattern Analyzer正则匹配字符较为灵活
Language Analyzer空格支持多国语言
Custom Analyzer自定义灵活

标准分词器

  • Standard Analyzer(默认):

    • 类型: standard
    • 特点:
      1. 根据空格和标点符号分割文本
      2. 进行小写化处理
      3. 过滤符号
    • 适用场景:适用于通用的全文搜索

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
    

空格分词器

  • Whitespace Analyzer:

    • 类型: whitespace
    • 特点:
      1. 根据空格分割文本
      2. 不进行小写化
      3. 保留所有字符
    • 适用场景:适用于不需要额外处理的精确匹配场景。

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog."]
    

简单分词器

  • Simple Analyzer:

    • 类型: simple

    • 特点:

      1. 按非字母切分
      2. 连续的数字为一个词条
      3. 进行小写处理
      4. 过滤符号
      5. 中文字单独建索引,并且把中文字转成拼音后也建搜索,这样就能同时支持中文和拼音检索。另外把拼音首字母也建索引,这样搜索 zjl 就能命中 “周杰伦”。
    • 适用场景:适用一些简单的中文分词

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
    

关键词分词器

  • Keyword Analyzer:

    • 类型: keyword
    • 特点: 将整个输入视为单个关键字,不进行分词。
    • 适用场景:适用于不需要分词的场景,比如精确匹配。

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["The quick brown fox jumps over the lazy dog."]
    

停用词分词器

  • Stop Analyzer:

    • 类型: stop
    • 特点:
      1. 去除停用词(is、a、the……)
      2. 根据空格分割文本
      3. 进行小写化处理。
    • 适用场景:适用于需要去除常见停用词的场景。

    示例

    原始文本:"The quick brown fox jumps over the lazy dog."
    分词结果:["quick", "brown", "fox", "jumps", "over", "lazy", "dog"]
    

IK分词器

  • IK Analyzer:

    详情请参考:https://github.com/medcl/elasticsearch-analysis-ik

    • 类型:
      • ik_max_word :会将文本做最细粒度的拆分,会穷尽各种可能的组合,适合 Term Query
      • ik_smart:会做最粗粒度的拆分,不会对同一个词进行重复分词,适合 Phrase 查询
    • 适用场景:适用于中文文本分析。

    示例

    原始文本:"中华人民共和国国歌"
    ik_max_word分词结果:["中华人民共和国", "中华人民", "中华", "华人", "人民共和国", "人民", "人", "民", "共和国", "共和", "和", "国国", "国歌"]
    ik_smart分词结果:["中华人民共和国", "国歌"]
    
  • ik分词器的使用步骤

    • Step1:下载ik分词器
    • Step2:将下载的压缩包解压到 Elasticsearch 插件目录(plugins 文件夹)中
    • Step3:重启ElasticSearch
    • Step4:直接指定即可

NGram分词器

  • NGram Analyzer:

    详情参考:ElasticSearch之ngram分词器-CSDN博客

    • 类型:

      • edge_ngram:从单词的开头提取 n-gram
      • ngram:在整个单词中提取 n-gram
    • 适用场景:适用于前缀搜索和搜索建议

    示例

    原始文本:"I am Chinese."edge_ngram分词结果:
    n=2(bigram): ["I am", "am Chinese."]
    n=3(trigram): ["I am Chinese."]
    n=4(four-gram): ["I am Chinese."]ngram分词结果:
    n=2(bigram): ["I am", "am Chinese."]
    n=3(trigram): ["I am Chinese."]
    n=4(four-gram): ["I am Chinese."]
    

    备注:

    1. NGram Analyzer 不会过滤符号
    2. NGram Analyzer默认的步长是1
    {"settings": {// 创建分词器"analysis": {"analyzer": {"my_edge_ngram_analyzer": {"tokenizer": "standard", // 指定分词器"filter": ["my_edge_ngram_filter"] // 指定词汇过滤器}},"filter": {"my_edge_ngram_filter": {"type": "edge_ngram","min_gram": 1, // 词汇最小长度为一个字符,注意:一个单词、数字、中文都是一个字符"max_gram": 10 // 词汇最大长度为10个字符}}}},"mappings": {"properties": {"content": {"type": "text","analyzer": "my_edge_ngram_analyzer" // 使用我们配置的分词器}}}
    }
    

    知识拓展:n-gram 概念

    n-gram 是一种文本处理的方法,其中 “n” 表示包含的元素的数量。在自然语言处理和信息检索中,n-gram 通常指的是连续的 n 个单词(或字符)序列。

    • Unigram(1-gram): 包含一个单词的序列。例如,对于句子 “The quick brown fox”,每个单词都是一个 unigram。
    • Bigram(2-gram): 包含两个相邻单词的序列。例如,对于句子 “The quick brown fox”,bigrams 包括 “The quick”、“quick brown”、“brown fox”。
    • Trigram(3-gram): 包含三个相邻单词的序列。例如,对于句子 “The quick brown fox”,trigrams 包括 “The quick brown”、“quick brown fox”。

    这个 n 表示按照几个单词来进行划分

正则匹配分词器

  • Pattern Analyzer
    • 类型pattern
    • 特点:根据正则匹配进行分词
{"settings": {"analysis": {"analyzer": {"my_pattern_analyzer": {"type": "pattern","pattern": "\\W+"  // 正则表达式模式,表示使用非单词字符作为分隔符}}}},"mappings": {"properties": {"content": {"type": "text","analyzer": "my_pattern_analyzer"}}}
}

上诉配置的 Pattern Analyzer 与 Standard Analyzer的效果是一模一样的

语言分词器

  • Language Analyzer
    • 类型
      • english:英语分词器
      • french:法语分词器
    • 特点
      1. 支持多个不同国家语言的分词,但就是没有支持中文的(中文分词器还得靠国内大佬或机构开发)
      2. 应用英文的 Stop Analyzer(停用词过滤器)
      3. 单词小写化
      4. 不会过滤符号
    • 适用场景:一些国际化的软件可能会用,但是面向国内用户基本上用不上
{"mappings": {"properties": {"content": {"type": "text","analyzer": "english"}}}
}
原始文本:"The quick brown fox jumps over the lazy dog."
分词结果:["quick", "brown", "fox", "jumps", "over", "lazy", "dog"]

自定义分词器

  • Custom Analyzer:

    • 类型: custom

    • 特点: 可以根据具体需求自定义分词器,包括指定分词器、字符过滤器、标记过滤器等。

    • 适用场景:现有分词器不满足当前功能,或者想要实现更加高效且灵活的分词

  • 实现自定义分词器的步骤

    • Step1定义字符过滤器(Char Filter),可以通过字符过滤器执行预处理,例如删除 HTML 标签或进行字符替换。
    • Step2定义分词器(Tokenizer), 分词器负责将文本切分为单词或词条。可以选择现有的分词器,也可以创建自定义的分词逻辑。
    • Step3定义词汇过滤器(Token Filter) ,可以通过词汇过滤器对切分后的单词进行进一步处理,例如小写处理、停用词过滤、同义词处理等。
    • Step4创建 Custom Analyzer ,将定义的字符过滤器、分词器和词汇过滤器组合成一个自定义的 Custom Analyzer
    • Step5将 Custom Analyzer 应用到字段 ,在创建索引时,将自定义的 Custom Analyzer 分配给相应的字段。

示例

在下面的示例中,my_analyzer 是一个自定义的 Custom Analyzer,包含了一个 HTML 标签过滤器、标准分词器和小写过滤器。该分析器被应用于名为 “content” 的字段。实际上,你可以根据需求自定义各个组件,以满足你的分词需求。

{"settings": {"analysis": {// 指定字符过滤器"char_filter": {"my_char_filter": {"type": "html_strip" // 去除文本中的 HTML 标签的字符过滤器}},// 指定分词器"tokenizer": {"my_tokenizer": {"type": "standard" // 指定标准分词器,按照标准分词器进行分词}},// 指定词汇过滤器"filter": {"my_filter": {"type": "lowercase" // 小写化处理}},// 创建自定义分词器"analyzer": {"my_analyzer": {"type": "custom","char_filter": ["my_char_filter"],"tokenizer": "my_tokenizer","filter": ["my_filter"]}}}},"mappings": {"properties": {"content": { // 给 content 字段应用 自定义分词器"type": "text","analyzer": "my_analyzer"}}}
}
原始文本:<p>This is <strong>bold</strong> text.</p>
分词结果:["this", "is", "bold", "text"]

参考资料

  • Anatomy of an analyzer | Elasticsearch Guide 8.11| Elastic
  • ElasticSearch 分词器,了解一下 - 知乎 (zhihu.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/141226.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何利用黑群晖虚拟机和内网穿透实现公网远程访问

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

Linux系统上搭建高可用Kafka集群(使用自带的zookeeper)

本次在CentOS7.6上搭建Kafka集群 Apache Kafka 是一个高吞吐量的分布式消息系统&#xff0c;被广泛应用于大规模数据处理和实时数据管道中。本文将介绍在CentOS操作系统上搭建Kafka集群的过程&#xff0c;以便于构建可靠的消息处理平台。 文件分享&#xff08;KafkaUI、kafka…

No193.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

ctfshow sql171-179

mysql 先打开我们本地的mysql&#xff0c;可以看到这些数据库 information_schema information_schema 库: 是信息数据库&#xff0c;其中保存着关于MySQL服务器所维护的所有其他数据库的信息比如数据库名&#xff0c;数据库表&#xff0c; SCHEMATA表: 提供了当前MySQL实例…

Golang 字符串处理汇总

1. 统计字符串长度&#xff1a;len(str) len(str) 函数用于统计字符串的长度&#xff0c;按字节进行统计&#xff0c;且该函数属于内置函数也不用导包&#xff0c;直接用就行&#xff0c;示例如下&#xff1a; //统计字符串的长度,按字节进行统计: str : "golang你好&qu…

​软考-高级-系统架构设计师教程(清华第2版)【第4章 信息安全技术基础知识(P160~189)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第4章 信息安全技术基础知识&#xff08;P160~189&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

postgresql实现job的六种方法

简介 在postgresql数据库中并没有想oracle那样的job功能&#xff0c;要想实现job调度&#xff0c;就需要借助于第三方。本人更为推荐kettle&#xff0c;pgagent这样的图形化界面&#xff0c;对于开发更为友好 优势劣势Linux 定时任务&#xff08;crontab&#xff09; 简单易用…

Redhat7设置国内可用yum源

问题&#xff1a; 因为最近安装了redhat7&#xff0c;在使用的时候提示系统未注册订阅&#xff0c;无法使用官方的yum源进行安装软件。为此&#xff0c;我使用centos7国内的yum源替换redhat的官方的yum源实现软件安装。 “This system is not registered with an entitlement …

【2011年数据结构真题】

41题 41题解答&#xff1a; &#xff08;1&#xff09;图 G 的邻接矩阵 A 如下所示&#xff1a; 由题意得&#xff0c;A为上三角矩阵&#xff0c;在上三角矩阵A[6][6]中&#xff0c;第1行至第5行主对角线上方的元素个数分别为5, 4, 3, 2, 1 用 “ 平移” 的思想&#xff0c;…

Outlook无法显示阅读窗格

Outlook无法显示阅读窗格 故障现象 Outlook主界面不显示阅读窗格 故障截图 故障原因 阅读窗格被关闭 解决方案 1、打开Outlook - 视图 – 阅读窗格 2、选择“靠右”或者“底部”&#xff0c;正常显示阅读窗格

同济 MBA 携手和鲸课程共建,以数智人才培养持续赋能企业数字化转型

数智化的浪潮席卷全球&#xff0c;我国产业界应如何做出应变&#xff1f;各企业又该如何深化数字化转型&#xff1f;在任重道远的持续探索中&#xff0c;数智人才培养作为企业实现成功转型的关键要素&#xff0c;已然成为大势所趋。 同济大学综合 MBA 项目高度重视工商管理人才…

什么是代理IP池?如何判断IP池优劣?

代理池充当多个代理服务器的存储库&#xff0c;提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务&#xff0c;而无需担心被检测或阻止的风险。代理池为各种在线活动&#xff08;例如网页抓取、安全浏览等&#xff09;提高后勤保障。 读完…

lua 时间差功能概略

简介 在进行程序设计过程中&#xff0c;经常需要对某些函数、某些程序片断从开始运行到运行结束所耗费的时间进行一些量化。这种量化实际上就是计算时间差。 获取函数耗时情景如下&#xff1a; function time_used() --开始计时-- do something at here. --结束计时--时间差&…

基于Python+Django的寻人失物失物招领系统

运行环境 开发语言&#xff1a;Python python框架&#xff1a;django 软件版本&#xff1a;python3.7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;PyCharm/vscode 前端框架:vue.js 项目介绍 寻人失物失物招领系统交流平台的主要使用…

浅析网络协议-HTTP协议

1.HTTP简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件, 图…

MyBatis 反射工具箱:带你领略不一样的反射设计思路

反射是 Java 世界中非常强大、非常灵活的一种机制。在面向对象的 Java 语言中&#xff0c;我们只能按照 public、private 等关键字的规范去访问一个 Java 对象的属性和方法&#xff0c;但反射机制可以让我们在运行时拿到任何 Java 对象的属性或方法。 有人说反射打破了类的封装…

Redis应用之一自增编号

一、前言 前段时间同事用Redis实现收银台商品排行榜&#xff0c;我们都知道Redis最基础的功能是用来缓存数据&#xff0c;但其实它还有很多特性能解决很多实际问题&#xff0c;接下来几篇文章我们就聊聊Reids一些特性的应用&#xff0c;今天先聊一下借助Reids生成不会重复的订…

电源基础元件

文章目录 电源基础元件理想电压源理想电流源受控电源 电源基础元件 理想电压源 定义 其两端电压总能保持定值或一定的时间函数&#xff0c;其值与流过它的电流i无关的元件叫理想电压源 理想电压源的电压、电流关系 1.电源两端电压由电源本身决定&#xff0c;与外电路无关&…

linux espeak语音tts;pyttsx3 ubuntu使用

整体使用espeak声音很机械不太自然 1、linux espeak语音tts 安装&#xff1a; sudo apt install espeak使用&#xff1a; #中文男声 espeak -v zh 你好 #中文女声 espeak -v zhf3 你好 #粤语男声 espeak -v zhy 你好注意&#xff1a;espeak -v zh 你好 &#xff08;Full d…

什么是M-LAG?为什么需要M-LAG?

你们好&#xff0c;我的网工朋友。 今天给你说说M-LAG技术。 总有人把M-LAG技术和IRF堆叠技术放在一起做对比&#xff0c;说这是可以取代堆叠的技术。 那M-LAG和堆叠到底有没有关系&#xff1f; 其实关系并不是很大&#xff0c;M-LAG可以理解为IRF和链路聚合的结合体。 那…