Elasticsearch:Standard Text Analyzer - 标准文本分析器

news2024/10/7 13:22:51

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

Analyzer描述
Standard analyzer这是默认的分析器,它根据语法、标点符号和空格对输入文本进行分词。 输出分词是小写的。
Simple analyzer简单分词器将输入文本拆分为任何非字母,例如空格、破折号、数字等。和标准分析器一样,简单分词器也会将输出分词小写。
Stop analyzer它是一个简单分析器,默认启用英文停用词。
Whitespace analyzer空白分析器的工作是根据空白定界符对输入文本进行分词。
Keyword analyzer关键字分析器不会改变输入文本。 该字段的值按原样存储。
Language analyer顾名思义,语言分析器有助于处理人类语言。 Elasticsearch 提供了英语、西班牙语、法语、俄语、印地语等几十种语言分析器,可以处理不同的语言。
Pattern analyzer模式分析器根据正则表达式 (regex) 拆分分词。 默认情况下,所有非单词字符都有助于将句子拆分为分词。
Fingerprint analyzer指纹分析器排序并删除重复的分词以生成单个连接的分词

有关上述的分析器的更多描述,请参阅我之前的文章 “Elasticsearch: analyzer”。

标准分析器(standard analyzer)是默认的分析器,在文本分析中被广泛使用。 让我们在下面通过示例来了解如何使用标准分析器。

注意:Elasticsearch 提供了一些内置的分析器,并让我们通过混合和匹配过滤器和标记器来自定义它们来创建过多的分析器。 在本文中逐一详述过于冗长且不切实际,但我将在文章中提供尽可能多的示例。 我建议您参考特定组件的官方文档以及将它们集成到你的应用程序中。

Standard analyzer

标准分析器是 Elasticsearch 中使用的默认分析器。 标准分析器的工作是根据空格、标点符号和语法对句子进行分词。

  • 没有 Char Filter
  • 使用 standard tokonizer
  • 把字符串变为小写,同时有选择地删除一些 stop words 等。默认的情况下 stop words 为 _none_,也即不过滤任何 stop words。

 假设我们想要建立一个包含零食和饮料的奇怪组合的索引。 考虑以下提到咖啡加爆米花的文本:

“Hot cup of ☕ and a 🍿is a Weird Combo :(!!”

我们可以将此文本索引到 weird_combos 索引中,如下所示:

POST weird_combos/_doc 
{
  "text": "Hot cup of ☕ and a 🍿is a Weird Combo :(!!"
}

文本被分词,分词列表以压缩形式显示如下:

[“hot”, “cup”, “of”, “☕”, “and”, “a”, “””🍿”””, “is”, “a”, “weird”, “combo”]

当然我们在使用上面的命令时,很难知道上面的句子是如何被分词的。我们可以使用如下的命令来进行查看:

POST _analyze
{
  "text": "Hot cup of ☕ and a 🍿is a Weird Combo :(!!"
}

如果没有指定 analyzer,它将自动使用 standard analyzer 作为句子的分析器。当然,我们也可以显示地定义它的分析器:

POST _analyze
{
  "text": "Hot cup of ☕ and a 🍿is a Weird Combo :(!!",
  "analyzer": "standard"
}

上面命令返回的结果为:

{
  "tokens": [
    {
      "token": "hot",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "cup",
      "start_offset": 4,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "of",
      "start_offset": 8,
      "end_offset": 10,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "☕",
      "start_offset": 11,
      "end_offset": 12,
      "type": "<EMOJI>",
      "position": 3
    },
    {
      "token": "and",
      "start_offset": 13,
      "end_offset": 16,
      "type": "<ALPHANUM>",
      "position": 4
    },
    {
      "token": "a",
      "start_offset": 17,
      "end_offset": 18,
      "type": "<ALPHANUM>",
      "position": 5
    },
    {
      "token": "🍿",
      "start_offset": 19,
      "end_offset": 21,
      "type": "<EMOJI>",
      "position": 6
    },
    {
      "token": "is",
      "start_offset": 21,
      "end_offset": 23,
      "type": "<ALPHANUM>",
      "position": 7
    },
    {
      "token": "a",
      "start_offset": 24,
      "end_offset": 25,
      "type": "<ALPHANUM>",
      "position": 8
    },
    {
      "token": "weird",
      "start_offset": 26,
      "end_offset": 31,
      "type": "<ALPHANUM>",
      "position": 9
    },
    {
      "token": "combo",
      "start_offset": 32,
      "end_offset": 37,
      "type": "<ALPHANUM>",
      "position": 10
    }
  ]
}

从输出中可以看出,分词是小写的。 标准分词器删除了末尾的笑脸和感叹号,但表情符号被保存为文本信息。 这是标准分析器的默认行为,它根据空格和非字母字符条(如标点符号)对单词进行标记。 下图显示了先前输入文本通过分析器时的工作原理。

输出表明标准分析器的工作:单词是根据空格和非字母(标点符号)拆分的,这是标准分词器的标志。 然后分词通过小写分词过滤器(lowercase token filter)。

注意内置分析器的组件:每个内置分析器都带有一组预定义的组件,例如字符过滤器、分词器和分词过滤器 —— 例如,指纹分析器由标准分词器和一堆 分词过滤器(指纹、小写、asciifolding 和停止分词过滤器)但没有字符过滤器。 除非你随着时间的推移记住了分析器的解剖结构,否则并不容易! 因此,我的建议是,如果你需要详细了解分析器的细节,请检查官方文档页面上分析器的定义。

下图显示了此命令在 DevTools 中的压缩输出。 如你所见,“coffee” 和 “popcorn” 的标记按原样存储,并且删除了非字母字符,例如 :( 和 !!。

 

使用 standard analyzer 输出的分词

 

测试标准分析器

我们可以在文本分析测试阶段通过在代码中添加额外的 analyzer 属性来添加特定的分析器。 下面的清单证明了这一点。

GET _analyze
{
  "analyzer": "standard",
  "text": "Hot cup of ☕ and a 🍿is a Weird Combo :(!!"  
}

如果你使用不同的分析器测试文本字段,则可以将分析器的值替换为你选择的值,例如:"analyzer": "whitespace"。

此代码产生与上图所示相同的结果。 输出表明文本已分词并小写。 下图为我们提供了标准分析器及其内部组件和解剖结构的图形表示。

 

如图所示,标准分析器由一个标准分词器和两个分词过滤器组成:小写(Lowercase)和停止(Stopwords)过滤器。 标准分析器上没有定义字符过滤器。 再次提醒我们自己,分析器由零个或多个字符过滤器、至少一个分词器和零个或多个分词过滤器组成。

尽管标准分析器配备了停用(stopwords)词标记过滤器,但默认情况下停用词过滤器是禁用的。 但是,我们可以通过配置其属性来打开它。

配置标准分析器

Elasticsearch 允许我们在标准分析器上配置一些参数,例如停用词过滤器、停用词路径和最大标记长度。 配置属性的方法是通过索引设置。 当我们创建索引时,我们可以通过设置组件来配置分析器:

PUT <my_index>
{
  "settings": {
    "analysis": {       
      "analyzer": { 
        ...
      }
    }
  }
}

停用词配置

让我们以在标准分析器上启用英语停用词为例。 我们可以通过在索引创建期间添加过滤器来完成此操作,如以下清单所示。

PUT my_index_with_stopwords
{
  "settings": {
    "analysis": {
      "analyzer": {
        "standard_with_stopwords":{ 
          "type":"standard", 
          "stopwords":"_english_" 
        }
      }
    }
  }
}

正如我们之前注意到的,标准分析器上的停用词过滤器被禁用。 现在我们已经使用配置了停用词的标准分析器创建了索引,任何被索引的文本都会通过这个修改后的分析器。 为了测试这一点,我们可以调用索引上的 _analyze 端点,如下面的清单所示:

POST my_index_with_stopwords/_analyze 
{
  "text": ["Hot cup of ☕ and a 🍿is a Weird Combo :(!!"],
  "analyzer": "standard_with_stopwords" 
}

上面的命返回的结果为:

{
  "tokens": [
    {
      "token": "hot",
      "start_offset": 0,
      "end_offset": 3,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "cup",
      "start_offset": 4,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "☕",
      "start_offset": 11,
      "end_offset": 12,
      "type": "<EMOJI>",
      "position": 3
    },
    {
      "token": "🍿",
      "start_offset": 19,
      "end_offset": 21,
      "type": "<EMOJI>",
      "position": 6
    },
    {
      "token": "weird",
      "start_offset": 26,
      "end_offset": 31,
      "type": "<ALPHANUM>",
      "position": 9
    },
    {
      "token": "combo",
      "start_offset": 32,
      "end_offset": 37,
      "type": "<ALPHANUM>",
      "position": 10
    }
  ]
}

此调用的输出显示已删除常见(英语)停用词,例如“of”、“a”和“is”:

["hot", "cup", "☕" "🍿","weird", "combo"]

我们可以更改我们选择的语言的停用词。 例如,以下清单中的代码显示了带有印地语停用词和标准分析器的索引。

PUT my_index_with_stopwords_hindi
{
  "settings": {
    "analysis": {
      "analyzer": {
        "standard_with_stopwords_hindi":{
          "type":"standard",
          "stopwords":"_hindi_" 
        }
      }
    }
  }
}

我们可以使用前面提到的 standard_with_stopwords_hindi 分析器来测试文本:

POST my_index_with_stopwords_hindi/_analyze
{
  "text": ["आप क्या कर रहे हो?"],
  "analyzer": "standard_with_stopwords_hindi"
}

如果您想知道这个印地语句子代表什么,它的意思是 “你在做什么?”

上面脚本的输出如下所示:

"tokens" : [{
  "token" : "क्या",
  "start_offset" : 3,
  "end_offset" : 7,
  "type" : "<ALPHANUM>",
  "position" : 1
}]

获得输出的唯一标记是क्या(第二个词),因为其余词都是停用词。 (它们在印地语中很常见)。

基于文件的停用词

如果内置停用词过滤器不满足或不满足我们的要求,我们可以通过显式文件提供停用词。

假设我们不希望用户在我们的应用程序中输入脏话。 我们可以创建一个包含所有列入黑名单的脏话的文件,并将该文件的路径作为参数添加到标准分析器中。 该文件必须相对于 Elastisearch 主页的配置文件夹存在。 以下清单使用接受停用词文件的分析器创建索引:

PUT index_with_swear_stopwords
{
  "settings": {
    "analysis": {
      "analyzer": {
        "swearwords_analyzer":{#A
          "type":"standard", #B
          "stopwords_path":"swearwords.txt" #C
        }
      }
    }
  }
}

stopwords_path 属性在 Elasticsearch 的配置文件夹内的目录中查找文件(在本例中为 swearwords.txt)。 以下清单演示了在 config 文件夹中创建文件的路径。 确保将目录更改为 $ELASTICSEARCH_HOME/config 并在其中创建 swearwords.txt 文件。 在列表中,请注意黑名单中的单词是在新行中创建的。

file:swearwords.txt
damn
bugger
bloody hell
what the hell
sucks

一旦创建了文件并开发了索引,如下面的清单所示,我们就可以使用带有自定义脏话的分析器了:

POST index_with_swear_stopwords/_analyze
{
  "text": ["Damn, that sucks!"],
  "analyzer": "swearwords_analyzer"
}

这段代码应该停止第一个和最后一个词通过索引过程,因为这两个词在我们的脏话黑名单中。 我们可以配置的下一个属性是分词的长度:作为输出,我需要分词的长度有多长。

配置分词的长度

我们还可以配置最大分词长度; 在这种情况下,分词将根据要求的长度进行拆分。 例如,下面的清单使用标准分析器创建了一个索引。 分析器配置为具有 7 个字符的最大分词长度。 如果我们提供一个长度为 13 个字符的词,该词将被拆分为 7 个和 6 个字符(例如,Elasticsearch 将变为 “Elastic”、“search”)。

PUT my_index_with_max_token_length
{
  "settings": {
    "analysis": {
      "analyzer": {
        "standard_max_token_length":{
          "type":"standard",
          "max_token_length":7
        }
      }
    }
  }
}

我们使用上面的索引来测试:

POST my_index_with_max_token_length/_analyze
{
  "text": "Elasticsearch is a powerful tool",
  "analyzer": "standard_max_token_length"
}

上面命令返回的结果为:

{
  "tokens": [
    {
      "token": "elastic",
      "start_offset": 0,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "search",
      "start_offset": 7,
      "end_offset": 13,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "is",
      "start_offset": 14,
      "end_offset": 16,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "a",
      "start_offset": 17,
      "end_offset": 18,
      "type": "<ALPHANUM>",
      "position": 3
    },
    {
      "token": "powerfu",
      "start_offset": 19,
      "end_offset": 26,
      "type": "<ALPHANUM>",
      "position": 4
    },
    {
      "token": "l",
      "start_offset": 26,
      "end_offset": 27,
      "type": "<ALPHANUM>",
      "position": 5
    },
    {
      "token": "tool",
      "start_offset": 28,
      "end_offset": 32,
      "type": "<ALPHANUM>",
      "position": 6
    }
  ]
}

很显然,Elasticsearch 及 powerful 两个词被拆分了,因为它们的长度超过了 7。

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

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

相关文章

SuSE linux server 11通过SAP来安装oracle11g

这里安装通过xmanager4进行安装&#xff0c;之前文章已经说了怎么通过xmanager4来连接linux系统&#xff0c;这里说一下安装oracle11g。 我这里是通过sap来安装oracle11g&#xff0c;所以需要 export LD_LIBRARY_PATH/oracle/P90/112_64/lib/:/sapmnt/P90/exe/ 同时在orap90用…

Mac使用命令行工具解压和压缩rar文件

目前在Mac电脑里支持解压缩的格式主要有&#xff1a;zip、gz等&#xff0c;但是还不支持rar格式的文件&#xff0c;接下来带着大家学习一下如何解压缩rar格式文件。 1.下载rar工具 打开&#xff1a;https://www.rarlab.com/download.htm 根据自己电脑的芯片要求选择自己的安装…

马云的创业故事及他人生中的摆渡人-卖掉中国黄页去北漂(四)

马云上京&#xff0c;是在外经贸部一位名叫王建国的朋友牵线之下&#xff0c;受邀担任外经贸部下属的中国国际电子商务中心&#xff08;下面简称EDI&#xff09;总经理&#xff0c;负责搭建外经贸部官网和网上中国商品交易市场。 马云团队在潘家园租了房子&#xff0c;白天上班…

如何编写高质量代码、提高编程效率?

一、 前言 高质量代码是指在满足功能需求的基础上&#xff0c;具备高性能、安全、可扩展、易维护、可测试等特点的代码。它不仅可以提高开发效率和代码质量&#xff0c;更能有效减少代码维护成本&#xff0c;促进团队协作和项目成功。因此&#xff0c;编写高质量代码对程序员来…

妙记多「我的主页」升级,日历聚合任务待办,为你打造个人时间管理系统⏰

我们应该如何处理“日程”和“待办”的关系&#xff1f; 日程和待办的区别与联系 从字面意义上来理解&#xff0c;日程是这一天的安排&#xff0c;待办是需要去完成的事情&#xff0c;日程与待办本质上是一种相互包含的关系。将所有事情都视作待办显然是不科学的&#xff0c;那…

二叉树的非递归遍历

目录 前言&#xff1a; 一&#xff1a;前序遍历 二&#xff1a;中序遍历 三&#xff1a;后序遍历 四&#xff1a;层序遍历 前言&#xff1a; 二叉树的非递归遍历需要借助栈和队列以及二叉树的一些基础接口&#xff0c;这些在之前的文章中有讲过&#xff0c;这里就不赘述&…

SSD目标检测

数据集以及锚框的处理 数据集&#xff1a; 图像&#xff1a;&#xff08;batch_size , channel , height , width&#xff09; bounding box: &#xff08;batch_size , m , 5&#xff09; m: 图像中可能出现的最多边界框的数目 5&#xff1a; 第一个数据为边界框对应的种…

tongweb

13051667606 东方通产品介绍 产品兼容 硬件要求 安装 安装目录结构 启动tongweb 停止tongweb bin下常用命令 企业版管理控制台 文档&#xff1a;产品简介及安装指南 绿色版直接解压安装 tar -zxvf …tar.gz Tongweb的配置文件 在conf的tongweb.xml 修改端口等信息 通过页面…

第四章 Unity工程和相机介绍

在上面的章节中&#xff0c;我们创建了一个“New Unity Project”工程&#xff0c;并保存到了“E:\workspace”工作空间下。那么&#xff0c;我就先看看这个工程的文件结构&#xff08;E:\workspace\ New Unity Project&#xff09;。 接下来&#xff0c;我们简单介绍一下这些目…

【老王读SpringMVC-3】根据 url 是如何找到 controller method 的?

前面分析了 request 与 handler method 映射关系的注册&#xff0c;现在再来分析一下 SpringMVC 是如何根据 request 来获取对应的 handler method 的? 可能有人会说&#xff0c;既然已经将 request 与 handler method 映射关系注册保存在了 AbstractHandlerMethodMapping.Ma…

Python 二进制 八进制 十进制 十六进制之间的转换

众所周知&#xff1a;计算机底层是以二进制数来进行存储计算&#xff0c;而计算机进制&#xff1a;数制是用一组固定的符号和统一的规则来表示数值的方法。 开始下面讲述之前首先要声明&#xff1a; 二进制&#xff0c;八进制&#xff0c;十六进制 都可以转换为十进制&#xf…

【DRF配置管理】如何在视图类使用get_objects()

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 DRF应用和管理 【DRF配置管理】Django使用DRF框架 【DRF配置管理】如何在视图类配置参数(一) 【DRF配置管理】如何在视图类配置参数(二) 【DRF配置管理…

第二届广州·琶洲算法大赛启动,百度飞桨助力广州打造中国算法新高地

‍‍ 生成式人工智能热潮席卷全球&#xff0c;算法创新成为 AI 突破发展的关键&#xff0c;推动实体经济高质量增长。4月25日&#xff0c;第二届广州琶洲算法大赛正式启动&#xff0c;广州市政府主办、百度飞桨等联合承办&#xff0c;广召天下算法英雄&#xff0c;加快“琶洲算…

<网络编程>网络套接字

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的关系 理解源端口号和目的端口号 初步认识TCP、UDP协议 TCP协议 UDP协议 网络字节序列 socket网络接口 socket常见API sockaddr结构 UDPsocket 编码&#xff1a; 理解源IP地址和目的IP地址 源IP&#xf…

服装店铺装修有哪些窍门?做好这3点,顾客主动上门

现在街边有各种各样的服装店&#xff0c;有的服装店客流不断&#xff0c;有的服装店却很冷清&#xff0c;导致这种现象的原因有很多&#xff0c;比较重要的一点就是你的服装店铺装修没做好。 你的服装店铺装修足够吸引人吗&#xff1f; 什么样的服装店铺装修才能吸引顾客&#…

【技巧】如何修改PDF文件?

PDF文件格式安全、标准化&#xff0c;很多人在工作中几乎离不开。可有些小伙伴想要修改PDF文件内容时&#xff0c;发现无法修改&#xff0c;那是什么情况呢&#xff1f;如何才能修改PDF文件呢&#xff1f;下面小编就来分享一些小技巧。 技巧一&#xff1a;使用PDF编辑器 如果使…

凌恩生物文献分享|一株细菌完成图也能发一区10分+!

期刊&#xff1a;Science of the Total Environment 影响因子&#xff1a;10.753 发表时间&#xff1a;2022 样本类型&#xff1a;Bosea sp. Ads-6菌株 客户单位&#xff1a;中国科学院微生物研究所 一、研究背景 环境中抗生素残留和耐药性的增加引发了许多…

一文详解汽车操作系统现状

摘要&#xff1a; 智能座舱和自动驾驶的发展&#xff0c;特斯拉的突飞猛进&#xff0c;让各大主机厂越来越重视汽车操作系统。但车企现在所做的软件定义汽车&#xff0c;大都是通过软硬件解耦来降低造车成本、丰富新车功能&#xff0c;在操作系统层面大都还停留在市场调研和学…

linux ubantu 16.04 安装fbprophet 和 pystan经验总结

写在前面 之前在window11上&#xff0c;安装了一下午&#xff0c;不是C版本不行&#xff0c;就是这个那个不通过&#xff0c;主要是Pystan运行不起来就很气&#xff0c;fbprophet本身就需要依赖这个包&#xff0c;然后MSVC不支持&#xff0c;裂开。尝试了很多次&#xff0c;碰…

基于Java开发的分布式在线教育系统,支持考试、直播、问答

一、开源项目简介 知道学习平台是一个基于 Java 开发的分布式在线教育系统项目采用前后端分离的企业级微服务架构引入组件化的思想实现高内聚低耦合&#xff0c;项目代码简洁注释丰富上手容易注重代码规范&#xff0c;严格控制包依赖可以帮助个人、企业或机构快速搭建一个在线…