Elasticsearch分词及其自定义

文章目录

  • 分词发生的阶段
    • 写入数据阶段
    • 执行检索阶段
  • 分词器的组成
      • 字符过滤
      • 文本切分为分词
      • 分词后再过滤
  • 分词器的分类
    • 默认分词器
    • 其他典型分词器
  • 特定业务场景的自定义分词案例
    • 实战问题拆解
    • 实现方案

分词发生的阶段

写入数据阶段

分词发生在数据写入阶段,也就是数据索引化阶段。举例如下。该例中使用的中文分词器ik自带词典,词典系2012年前后的词典。

在这里插入图片描述

执行检索阶段

当使用ik_smart分词器对“昨天,小明和他的朋友们去了市中心的图书馆”进行分词后,会将这句话分成不同的词汇或词组。

在执行“图书馆”检索时,Elasticsearch会根据倒排索引查找所有包含“图书馆”的文档。

分词器的组成

文档被写入并转换为倒排索引之前,Elasticsearch对文档的操作称为分析。而分析是基于Elasticsearch内置分词器(analyzer)或者自定义分词器实现的。

在这里插入图片描述

字符过滤

字符过滤器(character filter)将原始文本作为字符流接收,并通过添加、删除或更改字符来转换字符流。字符过滤器分类如下

字符过滤器(character filter)将原始文本作为字符流接收,并通过添加、删除或更改字符来转换字符流。

1)HTML Strip Character Filter:用于删除HTML元素,如删除<b>标签;解码HTML实体,如将&amp转义为&。

2)Mapping Character Filter:用于替换指定的字符。

3)Pattern Replace Character Filter:可以基于正则表达式替换指定的字符。

文本切分为分词

若进行了字符过滤,则系统将接收过滤后的字符流;若未进行过滤,则系统接收原始字符流。在接收字符流后,系统将对其进行分词,并记录分词后的顺序或位置(position)、起始值(start_offset)以及偏移量(end_offset-start_offset)。而tokenizer负责初步进行文本分词。

tokenizer分类如下,详细使用方法需参考官方文档。

❑Standard Tokenizer(标准分词器)

❑Letter Tokenizer(字母分词器)

❑Lowercase Tokenizer(小写转化分词器)

分词后再过滤

在对tokenizer处理后的字符流进行进一步处理时,例如进行转换为小写、删除(去除停用词)和新增(添加同义词)等操作,可能会感到有些复杂。不用担心,只需将它们的执行顺序牢记在心,结合实战案例的详细解析来进行理解,便能逐渐明白其中的奥妙。

分词器的分类

默认分词器

Elasticsearch默认使用standard分词器。也就是说,针对text类型,如果不明确指定分词器,则默认为standard分词器。standard分词器会将词汇单元转换成小写,并去除停用词和标点符号。它基于Unicode文本分割算法进行工作,适用于大多数语言。standard分词器针对英文的分词效果如下。

1)对于英文,以“A man can be destroyed,but not defeated.”为例,分词效果如下。

在这里插入图片描述
2)对于中文,以“昨天,小明和他的朋友们去了市中心的图书馆。”为例,分词效果如下。

在这里插入图片描述

其他典型分词器

在这里插入图片描述
使用IK分词器有以下注意事项。

1)IK自带词典并不完备,建议自己结合业务添加所属业务的词典。

2)IK采用动态添加词典的方式,建议修改IK分词插件源码,与MySQL数据库结合,以灵活支持动态词典的更新。

特定业务场景的自定义分词案例

业务需求是这样的:有一个作者字段,比如Li,LeiLei;Han,MeiMei以及LeiLei Li……现在要对其进行精确匹配。对此,你有什么想法?

你可能会考虑用自定义分词的方式,通过分号分词。但是这样的话,如果检索Li,LeiLei,那么LeiLei Li就不能被搜索到,而我们希望LeiLei Li也被搜索到。并且对于这种分词,Li,LeiLei中间不加逗号也不能匹配到。但是为什么在映射里面添加停用词也是无效的呢?

实战问题拆解

首先来看自定义分词器在映射的Settings部分中的设置。

### 创建索引
PUT my_index_0601
{"settings": {"analysis": {"char_filter": {},"tokenizer": {},"filter": {},"analyzer": {}}}
}

分词器由如下几部分组成。

❑"char_filter":{},——对应字符过滤部分。

❑"tokenizer":{},——对应文本切分为分词部分。

❑"filter":{},——对应分词后再过滤部分。

❑"analyzer":{}——对应分词器,包含上述三者。

然后来拆解问题,如下所示。
❑核心问题1:实际检索中,名字不带“,”,即逗号需要通过字符过滤掉。

方案:在char_filter阶段实现过滤。

❑核心问题2:基于什么进行分词?

方案:在Li,LeiLei;Han,MeiMei;的构成中,只能采用基于“;”的分词方式。

❑核心问题3:支持姓名颠倒后的查询,即LeileiLi也能被检索到。

方案:需要结合同义词实现。在分词后的过滤阶段,将LiLeiLei和LeiLeiLi设定为同义词。

实现方案

在这里插入图片描述

PUT my_index_0601
{"settings": {"analysis": {"char_filter": {"my_char_filter": {"type": "mapping","mappings": [", => "]}},"tokenizer": {"my_tokenizer": {"type": "pattern","pattern": """\;"""}},"filter": {"my_synonym_filter": {"type": "synonym","expand": true,"synonyms": ["leileili  => lileilei","meimeihan => hanmeimei"]}},"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer","char_filter": ["my_char_filter"],"filter": ["lowercase","my_synonym_filter"]}}}},"mappings": {"properties": {"name": {"type": "text","analyzer": "my_analyzer"}}}
}POST my_index_0601/_analyze
{"analyzer": "my_analyzer","text": "Li,LeiLei;Han,MeiMei"
}POST my_index_0601/_analyze
{"analyzer": "my_analyzer","text": "LeiLei,Li;MeiMei,Han"
}####批量写入数据
POST my_index_0601/_bulk
{"index":{"_id":1}}
{"name":"Li,LeiLei;Han,MeiMei"}
{"index":{"_id":2}}
{"name": "LeiLei,Li;MeiMei,Han"}POST my_index_0601/_search
{"query": {"match_phrase": {"name": "lileilei"}}
}

在这里插入图片描述

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

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

相关文章

AVL树、红黑树

数据结构、算法总述:数据结构/算法 C/C-CSDN博客 AVL树 定义 空二叉树是一个 AVL 树如果 T 是一棵 AVL 树,那么其左右子树也是 AVL 树,并且 ,h 是其左右子树的高度树高为 平衡因子:右子树高度 - 左子树高度 创建节点…

关于大语言模型的论文和学习资源集合

Milestone Papers DatekeywordsInstitutePaperPublication2017-06TransformersGoogleAttention Is All You NeedNeurIPS2018-06GPT 1.0OpenAIImproving Language Understanding by Generative Pre-Training2018-10BERTGoogleBERT: Pre-tra

HBase无法给用户赋权的解决方案

建表之后,在赋权的时候,发现有错误 2.以开始以为语法有错误,不会啊,很简单的语法。经过测试几个命令发现,但凡和权限相关的命令,都失败了 百度到一些建议,需要检查参数,在确认下面…

用vue实现json模版编辑器

用vue实现json模版编辑器 控件区表单区配置项区 (还没写)业务逻辑 设想业务逻辑是拖拽控件生成表单 动手做了一个简单的demo 业务的原型图设想如下所示 其中使用的技术主要是vuedragger 控件区 做控件区的时候首先我们要有确定的配置项 其实也很简单 …

Github20K星开源团队协作工具:Zulip

Zulip:让团队协作的每一次交流,都精准高效。- 精选真开源,释放新价值。 概览 随着远程工作的兴起和团队协作的需求不断增加,群组聊天软件成为了日常工作中不可或缺的一部分。Zulip 是github上一个开源的团队协作工具,…

SpringBoot:缓存

点击查看SpringBoot缓存demo:LearnSpringBoot09Cache-Redis 技术摘要 注解版的 mybatisCacheConfigCacheableCachePut:既调用方法,又更新缓存数据;同步更新缓存CacheEvict:缓存清除Caching:定义复杂的缓存…

Java 和 C++ 的区别

在面试中,经常会被问到Java和C的区别,即使你没有学过C,也需要对这些区别有所了解。虽然Java和C都是面向对象的编程语言,都支持封装、继承和多态,但它们之间仍然存在许多重要的不同点。以下是一些关键的区别&#xff0c…

图的拓扑序列(BFS_如果节点带着入度信息)

way&#xff1a;找入度为0的节点删除&#xff0c;减少其他节点的入度&#xff0c;继续找入度为0的节点&#xff0c;直到删除完所有的图节点。&#xff08;遍历node的neighbors就能得到neighbors的入度信息&#xff09; #include<iostream> #include<vector> #incl…

【运维自动化-配置平台】如何自动应用主机属性

主要用于配置主机属性的自动应用。当主机发生模块转移或模块新加入主机时&#xff0c;会根据目标模块配置的策略自动触发修改主机属性&#xff0c;比如主机负责人、主机状态。主机属性自动应用顾名思义是应用到主机上&#xff0c;而主机是必须在模块下的&#xff0c;所以有两种…

net 7部署到Linux并开启https

1.修改代码设置后台服务运行 安装nuget包 Install-Package Microsoft.Extensions.Hosting.WindowsServices Install-Package Microsoft.Extensions.Hosting.Systemd在Program代码中设置服务后台运行 var builder WebApplication.CreateBuilder(args);if (System.OperatingS…

【QuikGraph】C#调用第三方库计算有向图、无向图的连通分量

QuikGraph库 项目地址&#xff1a;https://github.com/KeRNeLith/QuikGraph 相关概念 图论、连通分量、强连通分量相关概念&#xff0c;可以从其他博客中复习&#xff1a; https://blog.csdn.net/weixin_50564032/article/details/123289611 https://zhuanlan.zhihu.com/p/3…

【LeetCode刷题】136.只出现一次的数字(Ⅰ)

【LeetCode刷题】136.只出现一次的数字&#xff08;Ⅰ&#xff09; 1. 题目&#xff1a;2.思路分析&#xff1a;思路1&#xff1a;一眼异或&#xff01; 1. 题目&#xff1a; 2.思路分析&#xff1a; 思路1&#xff1a;一眼异或&#xff01; 看到题目&#xff0c;如果有一定基…

Kafka学习-Java使用Kafka

文章目录 前言一、Kafka1、什么是消息队列offset 2、高性能topicpartition 3、高扩展broker 4、高可用replicas、leader、follower 5、持久化和过期策略6、消费者组7、Zookeeper8、架构图 二、安装Zookeeper三、安装Kafka四、Java中使用Kafka1、引入依赖2、生产者3、消费者4、运…

JavaScript异步编程——09-Promise类的方法【万字长文,感谢支持】

Promise 类的方法简介 Promise 的 API 分为两种&#xff1a; Promise 实例的方法&#xff08;也称为&#xff1a;Promis的实例方法&#xff09; Promise 类的方法&#xff08;也称为&#xff1a;Promise的静态方法&#xff09; 前面几篇文章&#xff0c;讲的都是 Promise 实…

USB3.0接口——(3)协议层(包格式)

1.协议层 1.1.超高速传输事务 超高速事务&#xff08;SuperSpeed transactions&#xff09;由主机对设备端点请求或发送数据开始&#xff0c;并在端点发送数据或确认收到数据时完成。 超高速总线上的数据传输&#xff08;transfer&#xff09;是主机请求设备应用程序生成的数…

记element-ui树形控件懒加载实现

概要 如何通过vue2element-ui实现树形控件的懒加载 整体架构流程 1.树形控件的组件代码 <el-tree:data"treeData":props"defaultProps":load"load"lazycurrent-change"handleNodeClick":expand-on-click-node"true":h…

【LAMMPS学习】九、LAMMPS脚本 示例

9. 示例脚本 LAMMPS 发行版包含一个包含许多示例问题的示例子目录。许多是二维模型&#xff0c;运行速度快且易于可视化&#xff0c;在台式机上运行最多需要几分钟。每个问题都有一个输入脚本 (in.*)&#xff0c;并在运行时生成一个日志文件 (log.*)。有些使用初始坐标的数据文…

课时125:awk实践_进阶知识_匹配运算

1.2.4 匹配运算 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 所谓的匹配运算&#xff0c;主要指的是关键字无法精确性的匹配相关信息了&#xff0c;但是我们可以结合一些关键字信息进行模糊的匹配。对于匹配运算来说&#x…

streamlit报错:AxiosError: Request failed with status code 403

解决办法&#xff1a; 步骤一&#xff1a;创建config.toml vi ~/.streamlit/config.toml 步骤二&#xff1a;加入以下内容 [server] enableXsrfProtection false enableCORS false步骤三&#xff1a;重新启动你的streamlit网页

排程过程中任务锁定的外延与内涵

在生产排程过程中&#xff0c;除了可以借助强大的算法&#xff0c;与优质的规划模型对待排任务进行排产优化外&#xff0c;还会遇到一些需要人为锁定部分任务的情况。无论是APS系统开发人员&#xff0c;还是排产作业人员&#xff0c;在常见的认识中&#xff0c;对于“锁定”概念…