ElasticSearch中常见的分词器介绍

news2025/3/11 6:31:53

文章目录

  • 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.coloradmin.cn/o/1198276.html

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

相关文章

泛微E-Office信息泄露漏洞复现

简介 Weaver E-Office是中国泛微科技&#xff08;Weaver&#xff09;公司的一个协同办公系统。 Weaver E-Office 9.5版本存在安全漏洞。攻击者利用该漏洞可以访问文件或目录。 漏洞编号&#xff1a;CVE-2023-2766 漏洞复现 FOFA语法&#xff1a; app"泛微-EOffice&qu…

Linux系统编程,Linux中的文件读写文件描述符

文章目录 Linux系统编程&#xff0c;Linux中的文件读写操作1.open函数&#xff0c;打开文件 Linux系统编程&#xff0c;Linux中的文件读写操作 1.open函数&#xff0c;打开文件 我们来看下常用的open函数 这个函数最终返回一个文件描述符struct file 我们查看一下它的Ubuntu…

[工业自动化-14]:西门子S7-15xxx编程 - 软件编程 - STEP7 TIA博途是全集成自动化软件TIA portal快速入门

目录 一、TIA博途是全集成自动化软件TIA portal快速入门 1.1 简介 1.2 软件常用界面 1.3 软件安装的电脑硬件要求 1.4 入口 1.5 主界面 二、PLC软件编程包含哪些内容 2.1 概述 2.2 电机运动控制 一、TIA博途是全集成自动化软件TIA portal快速入门 1.1 简介 Siemens …

java 继承和多态 (图文搭配,万字详解!!)

目录 1.继承 1.1 为什么需要继承 1.2 继承概念 1.3 继承的语法 1.4 父类成员访问 1.4.1 子类中访问父类的成员变量 1.4.2 子类中访问父类的成员方法 1.5 super关键字 1.6 子类构造方法 1.7 super和this 1.8 再谈初始化 1.9 protected 关键字 1.10 继承方式 1.11 f…

2560 动物保护宣传网站设计JSP【程序源码+文档+调试运行】

摘要 本文介绍了一个动物保护宣传网站的系统的设计与实现。该系统包括前台用户模块和后台管理员模块&#xff0c;具有用户注册/登录、新闻、资源库、法律法规、图片赏析、留言板、关于我们、用户后台等功能。通过数据库设计和界面设计&#xff0c;实现了系统的基本功能&#x…

Go常见数据结构的实现原理——map

&#xff08;一&#xff09;基础操作 版本&#xff1a;Go SDK 1.20.6 1、初始化 map分别支持字面量初始化和内置函数make()初始化。 字面量初始化&#xff1a; m : map[string] int {"apple": 2,"banana": 3,}使用内置函数make()初始化&#xff1a; m …

深度学习模型基于Python+TensorFlow+Django的垃圾识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 要使用Python、TensorFlow和Django构建一个垃圾识别系统&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装…

ArcGIS进阶:栅格计算器里的Con函数使用方法

本实验操作为水土保持功能重要性评价&#xff1a; 所用到的数据包括&#xff1a;土地利用类型数据&#xff08;矢量&#xff09;、植被覆盖度数据&#xff08;矢量&#xff09;和地形坡度数据&#xff08;栅格&#xff09;。 由于实验数据较少&#xff0c;其思路也较为简单&a…

【中间件篇-Redis缓存数据库04】Redis底层原理持久化、分布式锁

Redis底层原理 持久化 Redis虽然是个内存数据库&#xff0c;但是Redis支持RDB和AOF两种持久化机制&#xff0c;将数据写往磁盘&#xff0c;可以有效地避免因进程退出造成的数据丢失问题&#xff0c;当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB RDB持久化是把当…

基于python+TensorFlow+Django卷积网络算法+深度学习模型+蔬菜识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 介绍了TensorFlow在图像识别分类中的应用&#xff0c;并通过相关代码进行了讲解。通过TensorFlow提供的工具和库&am…

Jenkins 质量扫描

代码质量扫描工具&#xff08;SonarQube&#xff09; 质量评审 SonarQube有四个关键组件 ◼ SonarQube Server运行有三个组件 ◆ Web Server&#xff1a;UI ◆ Search Server&#xff1a;为UI提供搜索功能&#xff0c;基于ElasticSearch ◆ Compute Engine Server&#xff1a…

druid连接池异常GetConnectionTimeoutException(原创)

问题描述 有天&#xff0c;测试同学突然反馈系统页面查询缓慢&#xff0c;影响使用&#xff0c;我查了日志报&#xff1a; druid 连接池异常 GetConnectionTimeoutException wait millis 9120, active 20, maxActive 20 creating 0 结论先行 经一系列排查&#xff0c;得出数…

时序预测 | MATLAB实现WOA-CNN-BiGRU-Attention时间序列预测(SE注意力机制)

时序预测 | MATLAB实现WOA-CNN-BiGRU-Attention时间序列预测&#xff08;SE注意力机制&#xff09; 目录 时序预测 | MATLAB实现WOA-CNN-BiGRU-Attention时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基本描述 1.MATLA…

【黑客】学习笔记(小白自学)

一、黑客是什么 原是指热心于计算机技术&#xff0c;水平高超的电脑专家&#xff0c;尤其是程序设计人员。但后来&#xff0c;黑客一词已被用于泛指那些专门利用电脑网络搞破坏或者恶作剧的家伙。 二、学习黑客技术的原因 其实&#xff0c;网络信息空间安全已经成为海陆空之…

Lenovo联想小新Air-14笔记本2021款AMD锐龙ALC版(82LM)原装出厂Win10镜像和Windows11预装OEM系统

下载链接&#xff1a;https://pan.baidu.com/s/1akLkXM2HIg3eO76jqM-LVA?pwdxvo6 提取码&#xff1a;xvo6 系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&#xff1a;…

Haproxy实现七层负载均衡

目录 Haproxy概述 haproxy算法&#xff1a; Haproxy实现七层负载 ①部署nginx-server测试页面 ②(主/备)部署负载均衡器 ③部署keepalived高可用 ④增加对haproxy健康检查 ⑤测试 Haproxy概述 haproxy---主要是做负载均衡的7层&#xff0c;也可以做4层负载均衡 apache也可…

基于Python+OpenCV+SVM车牌识别系统-车牌预处理系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介系统流程系统优势 二、功能三、系统四. 总结 一项目简介 ## PythonOpenCVSVM车牌识别系统介绍 简介 PythonOpenCVSVM车牌识别系统是一种基于计算机视…

IIS前端服务和代理

前端服务可以用nginx和IIS开启&#xff0c;windows自带IIS方便管理一点。其实用docker的nginx更方便管理。 记录一下IIS的安装和开启服务过程 1、打开控制面板点击程序&#xff0c;再点击启用或关闭windows功能。 2、 点击左侧启用或关闭Windows功能。 3、把框框中全选上之后点…

快速走进通信世界 --- 基础知识扫盲

想不到吧&#xff0c;家人们&#xff0c;博主好久没来更新文章了&#xff0c;而且这次更新的是关于通信工程的文章。博主确实以前一直更新关于编程的文章&#xff0c;只不过最近在学习一些新的知识&#xff0c;以后有机会了我还是会继续更新一些编程技术文章的。不过每一门技术…

C++学习笔记(一):安装VisualStudio和Vcpkg

VisualStudio安装 error C4996: ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. #include <stdio.h>int main() {printf("hello"…