Elasticsearch分词及其自定义

news2024/10/5 14:16:15

文章目录

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

分词发生的阶段

写入数据阶段

分词发生在数据写入阶段,也就是数据索引化阶段。举例如下。该例中使用的中文分词器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.coloradmin.cn/o/1676705.html

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

相关文章

10G UDP协议栈 IP层设计-(5)IP RX模块

一、模块功能 1、解析目的IP是否是本节点的源IP,如果是则进行如下的处理,如果不是则无需上上级传递 2、提取MAC层发送过来的IP报文,并提取其中的数据字段(上层协议字段),传递给上级 3、提取IP报文头中的…

港股大反攻结束了吗?

‘港股长线见顶了吗?今天开盘就是最高点,然后一路跳水,市场又是一片恐慌。到底是健康的技术性回调,还是市场已经见顶? 港股此轮“大反攻”中,科网股表现十分亮眼。今日港股盘后,阿里巴巴、腾讯…

联软安渡 UniNXG 安全数据交换系统 任意文件读取漏洞复现

0x01 产品简介 联软安渡UniNXG安全数据交换系统,是联软科技自研的业内融合网闸、网盘和DLP的一体机产品,它同时支持多网交换,查杀毒、审计审批、敏感内容识别等功能,是解决用户网络隔离、网间及网内数据传输、交换、共享/分享、存储的理想安全设备,具有开创性意义。 UniN…

【Android踩坑】 Constant expression required

gradle 8,报错 Constant expression required:意思是case语句后面要跟常量 解决1 单击switch语句,键盘按下altenter,将switch-case语句替换为if-else语句(或者手动修改) 解决2 在gradle.properties中添加 android.nonFinalRes…

Java(四)---方法的使用

文章目录 前言1.方法的概念和使用2.方法的定义3.实参和形参的关系4.方法重载4.1.改进4.2.注意事项 5.递归5.1 生活中的故事5.2 递归的概念 5.3.练习 前言 前面一章我们学习到了程序逻辑语句,在写代码的过程中,我们会遇到需要重复使用的代码块&#xff0…

使用 Python 进行图像验证码识别训练及调用

目录 1、验证码识别原理1.1 Tensorflow 介绍1.2 Tensorflow 运行原理1.3 卷积神经网络 CNN(Convolutional Neural Networks) 2、验证码识别实现步骤2.1 安装第三方模块2.1.1 安装 TensorFlow 模块2.2.2 安装 cuda2.2.3 下载 cudnn 2.2 读取验证码样本形成…

智慧公厕的核心技术详解:物联网、云计算、大数据、自动化控制

公共厕所是城市的重要组成部分,而智慧公厕的建设和管理正成为城市发展的重要方向。智慧公厕的核心技术即是物联网、云计算、大数据和自动化控制。下面将以智慧公厕源头实力厂家广州中期科技有限公司,大量精品案例项目现场实景实图实例,详细介…

【微命令】git config如何配置全局的用户和邮箱?(--global user.name、user.email;git config --help)

虽然经常用,也经常忘记,特此记录。 命令 git config --global user.name "myname" git config --global user.email test163.com另外一种方式 help git config --help |grep email | grep name直接help查看

Redis的集群模式——Java全栈知识(20)

1、主从模式 Redis 支持主从模式的集群搭建,这是 Redis 提供的最简单的集群模式搭建方案,目的是解决单点服务器宕机的问题。当单点服务器发生故障的时候保证 Redis 正常运行。 主从模式主要是将集群中的 Redis 节点分为主节点和从节点。然后读和写发生在…

C++初阶学习第六弹——string(1)——标准库中的string类

前言: 在前面,我们学习了C的类与对象,认识到了C与C语言的一些不同,今天,我们将进入C的 关键部分——STL,学习完这部分之后,我们就可以清楚的认识到C相比于C语言的快捷与便利 目录 一、为什么有s…

springboot房屋租赁系统

摘要 房屋租赁系统;为用户提供了一个房屋租赁系统平台,方便管理员查看及维护,并且可以通过需求进行设备信息内容的编辑及维护等;对于用户而言,可以随时进行查看房屋信息和合同信息,并且可以进行报修、评价…

面试集中营—rocketmq架构篇

一、基本定义 Apache RocketMQ 是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。消息队列 RocketMQ 可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。 Topic:消息主题&…

基于yolov2深度学习网络的单人口罩佩戴检测和人脸定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心程序 ..............................................................I0 imresize…

详述进程的地址空间

进程的地址空间 合法的地址 (可读或可写) 代码 (main, %rip 会从此处取出待执行的指令),只读数据 (static int x),读写堆栈 (int y),读写运行时分配的内存 (???),读写动态链接库 (???) 非法的地址 NULL,导致 se…

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二

Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之触控开关二 1.概述 这篇文章在触摸屏上绘制一个开关,通过点击开关实现控制灯的开关功能。 2.硬件 硬件连接参考第一篇文章介绍 Arduino-ILI9341驱动-SPI接口TFTLCD实现触摸功能系列之获取触控坐标一 3.实现…

使用Caché管理工具

Cach通过一个web工具来对其进行系统管理和完成管理任务,该方法的一个好处是不必将Cach安装到用于管理的系统上。目前,通过网络远程管理和控制对站点的访问,这些都比较容易。因为数据及其格式信息都直接来自被管理的系统,因此,这也可以最小化跨版本的兼容问题。 本文将描述…

【知识碎片】2024_05_14

本篇记录了两道关于位运算的选择题,和一道有点思维的代码题。 C语言碎片知识 求函数返回值,传入 -1 ,则在64位机器上函数返回( ) int func(int x) {int count 0;while (x){count;x x&(x - 1);//与运算} return c…

Java医院绩效核算系统与his对接所需数据有哪些?java+springboot+MySQL医院绩效管理系统-构建智慧医疗生态

Java医院绩效核算系统与his对接所需数据有哪些?javaspringbootMySQL医院绩效管理系统-构建智慧医疗生态 医院绩效核算系统与his对接所需数据 1、诊察工作量绩效:信息系统-财务权限-统计报表-报表浏览-财务常用报表-门诊医生工作量报表 2、判读及操作工…

微信小程序 - - - - - 使用TDesign库(微信小程序UI库)

使用TDesign库 1. 初始化依赖2. 安装TDesgin3. npm构建3. 修改 app.json 1. 初始化依赖 npm init -y2. 安装TDesgin yarn add tdesign-miniprogram -S --productionor npm install tdesign-miniprogram -S --production3. npm构建 3. 修改 app.json 将 app.json 中的 “styl…

CTF如何学习?

CTF如何学习?打CTF有什么用 CTF本身有几个常见的领域 MISC WEB [逆向 密码学](https://www.zhihu.com/search?q逆向 密码学&search_sourceEntity&hybrid_search_sourceEntity&hybrid_search_extra{“sourceType”%3A"answer"%2C"sourc…