ElasticSearch(五)— 文本分析与分词

一、文本分析

文本分析( analysis )是在文档被发送并加入倒排索引之前,Elasticsearch 在其主体上进行的操作。在文档被加入索引之前,Elasticsearch 让每个被分析字段经过一系列的处理步骤。

  1. 字符过滤–使用字符过滤器转变字符。
  2. 文本切分为分词—将文本切分为单个或多个分词。
  3. 分词过滤—使用分词过滤器转变每个分词。
  4. 分词索引–将这些分词存储到索引中。

字符过滤
Elasticsearch 首先运行字符过滤器(char filter)。这些过滤器将特定的字符序列转变为其他的字符序列。这个可以用于将 HTML 从文本中剥离,或者是将任意数量的字符转化为其他字符(也许是将“I love u 2”这种缩写的短消息纠正为“I love you too”。在“I like ELK……”的例子里使用特定的过滤器将“&” 替换为“and”。

切分为分词
在应用了字符过滤器之后,文本需要被分割为可以操作的片段。底层的Lucene 是不会对大块的字符串数据进行操作。相反,它处理的是被称为分词( token)的数据。
分词是从文本片段生成的,可能会产生任意数量(甚至是 0)的分词。例如,在英文中一个通用的分词是标准分词器,它根据空格、换行和破折号等其他字符, 将文本分割为分词。

分词过滤器
一旦文本块被转换为分词,Elasticsearch 将会对每个分词运用分词过滤器( token filter)。 这些分词过滤器可以将一个分词作为输入, 然后根据需要进行修改,添加或者是删除。最为有用的和常用的分词过滤器是小写分词过滤器,它将输人的分词变为小写,确保在搜索词条“nosql" 的时候,可以发现关“NoSq" 的聚会。分词可以经过多于 1 个的分词过滤器,每个过滤器对分词进行不同的操作,将数据塑造为最佳的形式,便于之后的索引。
例如: I like ELK,it include Elasticsearch&LogStash&Kibana
分词后再经过的分词过滤器:第 1 个将分词转为小写,第 2 个删除停用词(停止词)“and”,第三个将词条“tools" 作为“technologies" 的同义词进行添加。

分词索引
当分词经历了零个或者多个分词过滤器,它们将被发送到 Lucene 进行文档的索引。这些分词组成了倒排索引。

1.1 关于字符过滤器

字符过滤器种类不多。elasticearch 只提供了三种字符过滤器:

HTML 字符过滤器(HTML Strip Char Filter):从文本中去除 HTML 元素:
映射字符过滤器(Mapping Char Filter):接收键值的映射,每当遇到与键相同的字符串时,它就用该键关联的值替换它们。
模式替换过滤器(Pattern Replace Char Filter):使用正则表达式匹配并替换字符串中的字符。

1.2 关于分词

文本分词会发生在两个地方:
创建索引:当索引文档字符类型为 text 时,在建立索引时将会对该字段进行分词;
搜索:当对一个 text 类型的字段进行全文检索时,会对用户输入的文本进行分词。
所以这两个地方都可以对分词进行配置。

创建索引时
ES 将按照下面顺序来确定使用哪个分词器:
1、先判断字段是否有设置分词器,如果有,则使用字段属性上的分词器设置;
2、如果设置了 analysis.analyzer.default,则使用该设置的分词器;
3、如果上面两个都未设置,则使用默认的 standard 分词器。

设置索引默认分词器:

PUT indexname{"settings": {"analysis": {"analyzer": {"default": {"type": "simple"}}}}
}

还可以为索引配置内置分词器,并修改内置的部分选项修改它的行为:

put indexname{"settings": {"analysis": {"analyzer": {"my_analyzer": {"type": "standard","stopwords": ["the","a","an","this","is"]}}}}
}

为字段指定内置分词器:

put indexname{"mappings": {"properties": {"title": {"type": "text","analyzer": "standard","search_analyzer": "simple"}}}
}

文档搜索时
文档搜索时使用的分析器有一点复杂,它依次从如下参数中如果查找文档分析器,如果都没有设置则使用 standard 分析器:
1、搜索时指定 analyzer 参数
2、创建索引时指定字段的 search_analyzer 属性
3、创建索引时字段指定的 analyzer 属性
4、创建索引时 setting 里指定的 analysis.analyzer.default_search
5、如果都没有设置则使用 standard 分析器

搜索时指定 analyzer 查询参数:

GET my_index/_search{"query": {"match": {"message": {"query": "Quick foxes","analyzer": "stop"}}}
}

指定字段的 analyzer 和 seach_analyzer:

PUT my_index{"mappings": {"properties": {"title": {"type": "text","analyzer": "whitespace","search_analyzer": "simple"}}}
}

指定索引的默认搜索分词器:

PUT my_index{"settings": {"analysis": {"analyzer": {"default": {"type": "simple"},"default_seach": {"type": "whitespace"}}}}
}

分词器

标准分词器(standard)
标准分词器( standard tokenizer) 是一个基于语法的分词器,对于大多数欧洲语言来说是不错的。它还处理了 Unicode 文本的切分。它也移除了逗号和句号这样的标点符号。
例如: “I have, potatoes.”切分后的分词分别是” I” 、” have” 和” potatoes”。

关键词分词器(keyword):
关键词分词器( keyword tokenizer )是一种简单的分词器,将整个文本作为单个的分词,提供给分词过滤器。只想应用分词过滤器,而不做任何分词操作时,它可能非常有用。

字母分词器(letter):
字母分词器根据非字母的符号,将文本切分成分词。例如,对于句子“Hi,there."分词是 Hi 和 there,因为逗号、空格和句号都不是字母:'Hi, there. '分词是 Hi 和 there。

小写分词器(lowercase):
小写分词器( lowercase tokenizer)结合了常规的字母分词器和小写分词过滤器(如你所想,它将整个分词转化为小写)的行为。通过 1 个单独的分词器来实现的主要原因是,2 次进行两项操作会获得更好的性能。'Hi, there.'分词是 hi 和 there。

空白分词器(whitespace):
空白分词器( whitespace tokenizer )通过空白来分隔不同的分词,空白包括空格、制表符、换行等。请注意,这种分词器不会删除任何标点符号,所以文本“Hi, there." 的分词。'Hi, there. '分词是 Hi,和 there.。

模式分词器(pattern):
模式分词器( patterm tokenizer)允许指定一个任 意的模式,将文本切分为分词。被指定的模式应该匹配间隔符号。例如,可以创建一个定制分析器,它在出现文本“. -.”的地方将分词断开。

UAX URL 电子邮件分词器(uax_url_email):
在处理英语单词的时候,标准分词器是非常好的选择。但是,当下存在不少以网站地址和电子邮件地址结束的文本。标准分析器可能在你未注意的地方对其进行了切分。例如,有一个电子邮件地址的样本 john.smith@example.com,用标准分词器分析它,切分后:john.smith@example.com,分词是 john.smith 和 example.com。
它同样将 URL 切分为不同的部分:'http://example. com?q=foo’分词是 http、example.com、q 和 foo。
UAX URL 电子邮件分词器( UAX URL email tokenizer )将电子邮件和 URL 都作为单独的分词进行保留。

1.3 关于分词过滤器

标准分词过滤器(standard):不要认为标准分词过滤器( standard token filter )进行了什么复杂的计算,实际上它什么事情也没做。

小写分词过滤器(lowercase):小写分词过滤器( lowercase token filter)只是做了这件事:将任何经过的分词转换为小写。这应该非常简单也易于理解。

长度分词过滤器(length):长度分词过滤器(length token filter)将长度超出最短和最长限制范围的单词过滤掉。举个例子,如果将 min 设置为 2,并将 max 设置为 8,任何小于 2 个字符和任何大于 8 个字符的分词将会被移除。

停用词分词过滤器(stop): 停用词分词过滤器(stop token fite)将停用词从分词流中移除。对于英文而言,这意味着停用词列表中的所有分词都将会被完全移除。用户也可以为这个过滤器指定一个待移除 单词的列表。
停用词是指在信息检索中,为节省存储空间和提高搜索效率,在处理自然语言数据(或文本)之前或之后会自动过滤掉某些字或词,这些字或词即被称为Stop Words(停用词)。
停用词(Stop Words)大致可分为如下两类:
1、使用十分广泛,甚至是过于频繁的一些单词。比如英文的“i”、“is”、“what”,中文的“我”、“就”之类词几乎在每个文档上均会出现,查询这样的词搜索引擎就无法保证能够给出真正相关的搜索结果,难于缩小搜索范围提高搜索结果的准确性,同时还会降低搜索的效率。因此,在真正的工作中,Google和百度等搜索引擎会忽略掉特定的常用词,在搜索的时候,如果我们使用了太多的停用词,也同样有可能无法得到非常精确的结果,甚至是可能大量毫不相关的搜索结果。
2、文本中出现频率很高,但实际意义又不大的词。这一类主要包括了语气助词、副词、介词、连词等,通常自身并无明确意义,只有将其放入一个完整的句子中才有一定作用的词语。如常见的“的”、“在”、“和”、“接着”之类。
下面是英文的默认停用词列表:

a, an, and, are, as, at, be, but, by, for, if, in, into, is, it, no,not, of, on, or; such, that, the, their;then,there, these, they, this, to, was,will, with

截断分词过滤器( truncate token filter ):
允许你通过定制配置中的 length 参数,截断超过一定长度的分词。默认截断多于 10 个字符的部分。

修剪分词过滤器( trim token filter ):
删除 1 个分词中的所有空白部分。例如,分词" foo "将被转变为分词 foo。

限制分词数量分词过滤器(limit token count token filter):
限制了某个字段可包含分词的最大数量。例如,如果创建了一个定制的分词数量过滤器,限制是 8, 那么分词流中只有前 8 个分词会被索引。这个设置使用 max_ token_ count 参数,默认是 1 (只有 1 个分词会被索引)。

二、 分析器

上述的这些组件,组成了一个分析器。分析器可以定义为零个或多个字符过滤器、1 个分词器、零个或多个分词过滤器。Elasticsearch 中提供了很多预定义的分析器。我们可以直接使用它们而无须构建自己的分析器。

2.1 内置分析器

标准分析器
当没有指定分析器的时候,标准分析器( standardanalyzer)是文本的默认分析器。它综合了对大多欧洲语言来说合理的默认模块,它没有字符过滤器,包括标准分词器、小写转换分词过滤器和停用词分词过滤器(默认为_none_,也就是不去除停止词)。这里只需要记住,如果不为某个字段指定分析器,那么该字段就会使用标准分析器。可配置的参数如下:
max_token_length:默认值 255,表示词项最大长度,超过这个长度将按该长度分为多个词项
stopwords:默认值_none_,表示分析器使用的停止词数组,可使用内置停止词列表,比如_english_等
stopwords_path:停止词文件路径。

简单分析器:
简单分析器( simple analyzer)就是那么简单!它只使用了小写转换分词器,这意味着在非字母处进行分词,并将分词自动转变为小写。这个分析器对于亚洲语言来说效果不佳,因为亚洲语言不是根据空白来分词,所以请仅仅针对欧洲语言使用它。

空白分析器:
空白分析器( whitespace analyzer )什么事情都不做,只是根据空白将文本切分为若干分词。

停用词分析器:
停用词分析器( stop analyzer )和简单分析器的行为很相像,只是在分词流中额外地过滤了停用词。

关键词分析器:
关键词分析器( keyword analyzer )将整个字段当作一个单独的分词。

模式分析器:
模板分析器( pattern analyzer )允许你指定一个分词切分的模式。 但是,由于可能无论如何都要指定模式,通常更有意义的做法是使用定制分析器,组合现有的模式分词器和所需的分词过滤器。

雪球分析器:
雪球分析器( snowball analyzer )除了使用标准的分词器和分词过滤器(和标准分析器一样),也使用了小写分词过滤器和停用词过滤器。它还使用了雪球词干器对文本进行词干提取。

中文分析器:
上面的分析器基本都是针对英文的,对中文的处理不是太好,Standard 分析器把中文语句拆分为一个个的汉字,并不是太适合。这时候,就需要中文分析器。中文分析器有很多,例如 cjk,ik 等等,我们选用比较有名的 ik 作为我们的中文分析器。

IK 分词器有两种分词效果,一种是 ik_max_word(最大分词)和 ik_smart(最小分词)。
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国, 共和,和,国国,国歌”,会穷尽各种可能的组合;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”;

2.2 分析器的配置和使用

我们可以使用_analyze接口来查看分析情况、配置分析器等操作。

GET /_analyze
POST /_analyze
GET /<index>/_analyze
POST /<index>/_analyze

配置分析器:

PUT indexname{"settings": {"analysis": {"analyzer": {"my_analyzer": {"char_filter": ["html_strip","&_to_and"],"filter": ["lowercase","my_stopwords"],"tokenizer": "standard","type": "custom"}},"char_filter": {"&_to_and": {"mappings": ["&=>and"],"type": "mapping"}},"filter": {"my_stopwords": {"stopwords": ["king","james"],"type": "stop"}}}}
}

上述配置的意思是:去除所有的 HTML 标签;将 & 替换成 and ,使用一个自定义的 mapping 字符过滤器;
使用 standard 分词器分割单词;使用 lowercase 分词过滤器将词转为小写;用 stop 分词过滤器去除一些自定义停用词。

查看分词情况

POST indexname/_analyze{"analyzer": "my_analyzer","text": "<br> I & Lison & king & James are handsome<br>"
}

在这里插入图片描述

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

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

相关文章

JAVA同城圈子达人交友系统源码支持微信小程序+公众号+H5+APP

&#x1f308; 同城圈子达人交友系统&#xff0c;遇见志同道合的TA&#xff01; &#x1f389; 开篇&#xff1a;告别孤单&#xff0c;同城圈子等你来探索&#xff01; 在这个快节奏的城市生活中&#xff0c;你是否常常感到孤独&#xff0c;渴望找到一群志同道合的朋友&#…

2024年铜川宜君半程马拉松,暴晒+爬坡152安全完赛

1、赛事背景 2024年7月21日&#xff0c;我参加了2024年铜川宜君半程马拉松赛&#xff0c;7月举办的赛事很少&#xff0c;全国都算温度比较高的&#xff0c;虽然宜君是一个山城&#xff0c;还是会担心气温会高。 临开赛1、2周&#xff0c;陕西区域降水比较多&#xff0c;赛前一…

如何实现ECharts图表根据屏幕大小自适应?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Vue篇专栏内容:Vue-ECharts自适应 目录 前言 1920*1080分辨率示图 8184*2432分辨率示图 以vue3ts开发为例 (…

C++第十弹 ---- vector的介绍及使用

目录 前言vector的介绍及使用1. vector的使用1.1 vector的定义1.2 iterator的使用1.3 vector空间增长问题1.4 vector增删查改 2. vector迭代器失效问题(重点) 总结 前言 本文介绍了C中的vector数据结构及其使用方法。 更多好文, 持续关注 ~ 酷酷学!!! 正文开始 vector的介绍…

面试场景题系列--(2)短 URL 生成器设计:百亿短 URL 怎样做到无冲突?--xunznux

文章目录 面试场景题&#xff1a;短 URL 生成器设计&#xff1a;百亿短 URL 怎样做到无冲突&#xff1f;1. 需求分析2. 短链接生成算法2.1 自增法2.2 散列函数法2.3 预生成法 3. 部署模型3.1 其他部署方案 4. 设计4.1 重定向响应码4.2 短 URL 预生成文件及预加载4.3 用户自定义…

代码静态检查简介

在软件开发领域&#xff0c;确保代码质量是项目成功的关键要素之一。代码静态检查作为一种重要的质量保证手段&#xff0c;通过在不运行代码的情况下&#xff0c;对代码进行自动化的分析和审查&#xff0c;帮助开发团队及时发现并修复潜在的缺陷、安全漏洞以及不符合编码规范的…

Jenkins详细使用教程

目录 1. 什么是Jenkins&#xff1f; 2. 为什么使用Jenkins&#xff1f; 3. 安装Jenkins 3.1 下载相关文件 3.2 解压Linux版本的JDK 3.3 配置JDK环境 3.4 运行jenkins.war 3.5 安装完成 4. 访问Jenkins 5. 修改密码 6. 集成JDK 7. Jenkins集成Git 7.1 使用Jenkins拉取…

7月26日贪心练习-摆动序列专题

前言 大家好&#xff0c;今天学习用贪心思想解决摆动序列问题&#xff0c;共三题&#xff0c;分享自己的思路&#xff0c;请大家多多支持 算法思想 大家可以先看看这道我们后面会讲的题看看怎么个事&#xff0c;. - 力扣&#xff08;LeetCode&#xff09; 由此题题解说明算…

若依ruoyi+AI项目二次开发

//------------------------- //定义口味名称和口味列表静态数据 const dishFlavorListSelectref([ {name:"辣度",value:["不辣","微辣","中辣","重辣"]}, {name:"忌口",value:["不要葱","不要…

JVM之对象的创建过程

目录 对象的创建&#xff1a; 对象内存分配的两种方式&#xff1a; 指针碰撞&#xff1a; 空闲列表&#xff1a; 对象的内存布局&#xff08;基本结构&#xff09;&#xff1a; 对象的访问定位&#xff1a; 主流的访问方式主要有使用句柄和直接指针两种。 对象的创建&…

基于微信小程序+SpringBoot+Vue的流浪动物救助(带1w+文档)

基于微信小程序SpringBootVue的流浪动物救助(带1w文档) 基于微信小程序SpringBootVue的流浪动物救助(带1w文档) 本系统实现的目标是使爱心人士都可以加入到流浪动物的救助工作中来。考虑到救助流浪动物的爱心人士文化水平不齐&#xff0c;所以本系统在设计时采用操作简单、界面…

FPGA实现LCD1602控制

目录 注意&#xff01; 本工程采用野火征途PRO开发板&#xff0c;外接LCD1602部件进行测试。 有偿提供代码&#xff01;&#xff01;&#xff01;可以定制功能&#xff01;&#xff01;&#xff01; 联系方式见底部 一、基础知识 1.1 引脚信息 1.2 指令 1.2.1 清屏 1.…

ubuntu实践

目录 扩容 本机上ping不通新建立的虚拟机 ssh连接 装sshd ssh客户端版本较低&#xff0c;会报key exchange算法不匹配问题 ubuntun上装docker 将centos7下的安装包改造成适配 ubuntu的包 参考文章 扩容 Hyper-V 管理器安装的ubutun扩容磁盘空间说明_hype-v磁盘扩容-…

人工智能算法工程师(中级)课程20-模型注意力机制之注意力机制的原理、计算方式与代码详解

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能算法工程师(中级)课程20-模型注意力机制之注意力机制的原理、计算方式与代码详解。本文深入探讨了注意力机制在深度学习中的应用与原理&#xff0c;尤其聚焦于序列到序列模型的上下文中。通过直观的解释和详…

48 mysql 全局变量修改了时区, 客户端拿到的依然是旧时区

前言 这是一个 我们最近碰到的问题 在我们的一个 服务平台 查询到的时间字段 比 当前时区的当前时间多 8 小时 然后 这个问题 也是挺神奇的, navicate 上面查询到的 时间是在正常的时间 然后 查询环境变量 tz_zone 是 “08:00”, 也没有问题, 但是 客户端这边 拿到的是 当…

【HTML+CSS】HTML超链接:构建网页导航的基石

目录 什么是HTML超链接&#xff1f; 基本语法 示例 链接到另一个网页 链接到同一页面内的不同部分 常用属性 在Web开发的广阔世界中&#xff0c;HTML&#xff08;HyperText Markup Language&#xff09;作为网页内容的标准标记语言&#xff0c;扮演着至关重要的角色。而在…

nodejs安装及环境配置轨道交通运维检测系统App-OA人事办公排班故障维修

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-2

目录 高并发缓存三问 - 穿透 缓存穿透 概念 现象举例 解决方案 缓存穿透 - 预热架构 缓存穿透 - 布隆过滤器 布隆过滤器 布隆过滤器基本思想​编辑 了解 高并发缓存三问 - 击穿 缓存击穿 高并发缓存三问 - 雪崩 缓存雪崩 解决方案 总结 为什么要使用数据字典&…

对Linux目录结构的补充

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

白鲸开源CEO郭炜荣获「2024中国数智化转型升级先锋人物」称号

2024年7月24日&#xff0c;由数据猿主办&#xff0c;IDC协办&#xff0c;新华社中国经济信息社、上海大数据联盟、上海市数商协会、上海超级计算中心作为支持单位&#xff0c;举办“数智新质力拓未来 2024企业数智化转型升级发展论坛——暨AI大模型趋势论坛”数据猿“年中特别策…