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.hqwc.cn/news/701643.html

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

相关文章

PHP 自提时间

前端: 后台设置: 代码: public function getBusinessHour(){// 需求单门店$data (new StoreModel())->limit(1)->select()->toArray();$days explode(,, $data[0][shop_hours]);$businessHours $days[1];// 使用 explode 分割字符串,获取开始和结束时…

Leetcode 第 129 场双周赛题解

Leetcode 第 129 场双周赛题解 Leetcode 第 129 场双周赛题解题目1:3127. 构造相同颜色的正方形思路代码复杂度分析 题目2:3128. 直角三角形思路代码复杂度分析 题目3:3129. 找出所有稳定的二进制数组 I思路代码复杂度分析 题目4:…

LLM应用-prompt提示:让大模型总结生成思维导图

第一步:大模型生成markdown思维导图格式 例如:kimi 总结pdf文档案例: 生成的markdown格式: # 知识图谱的构建及应用 ## 一、知识图谱的构建 ### 1. 数据采集 - 来源:结构化数据库、半结构化网页、非结构化文本 - 预处…

2024年小学生古诗文大会备考:吃透历年真题和知识点(持续)

根据往年的安排,2024年小学生古诗文大会预计这个月就将启动。该如何备考2024年小学生古诗文大会呢?根据往期的经验,只要吃透这些真题和背后的知识点,通过上海小学生古诗文大会的初选(初赛)一点问题都没有。…

LeetCode 126题:单词接龙 II

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…

【源码】Spring Data JPA原理解析之Repository的自动注入(一)

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

单用户模式破解root密码

目录 一. 破解root密码 1. 查看操作系统版本 2.重启系统,进入grub菜单,选择要使用的内核,按e进入​编辑 3. 找到linux16那一行,把光标移动到最后,添加 init/bin/sh 然后ctrlx保存退出会自动进入系统 4. 进入系统后…

C++ 并发编程指南(11)原子操作 | 11.6、计算机内存结构

文章目录 一、计算机内存结构1、内存的基本组成2、内存的类型3、内存的结构层次4、CPU架构5、局部性原理6、总结 前言 在探讨计算机的运行效率和数据处理能力时,内存结构无疑是一个至关重要的部分。内存,作为计算机系统中的关键组件,承担着存…

详细分清Session,Cookie和Token之间的区别,以及JWT是什么东西

Cookie Cookie是一种小型的文本文件,由网站在用户访问时存储在其计算机或移动设备上,Cookie主要用于跟踪、识别和存储有关用户的信息。 简单来说Cookie就是用来存储某些后端发送给前端的数据,例如我们登陆后,后端会返回一个登录…

网站有存在哪些类型的漏洞,网站漏洞存在哪些危害,该怎么解决网站漏洞问题

在数字化日益发展的今天,随着互联网的普及和深入,网站安全已成为企业、组织乃至个人都必须高度重视的安全问题。而网站漏洞作为威胁网站安全的重要因素之一,其类型多种多样,不仅可能导致数据泄露、系统崩溃,还可能为黑…

CVPR2022人脸识别Partial FC论文及代码学习笔记

论文链接:https://openaccess.thecvf.com/content/CVPR2022/papers/An_Killing_Two_Birds_With_One_Stone_Efficient_and_Robust_Training_CVPR_2022_paper.pdf 代码链接:insightface/recognition/arcface_torch at master deepinsight/insightface G…

量化研究---A股赚钱日历,上证指数为例,提供源代码

今天把A股的全部数据导出做了一些赚钱日历分析,看那个月赚钱容易,那个月赚钱困难 导入需要的库 import pandas as pdimport matplotlib.pyplot as pltimport quantstats as qsfrom trader_tool.index_data import index_datafrom trader_tool import j…