ES自定义分词,对数字进行分词

需求:需要将下面类似的数据分词为:GB,T,32403,1,2015

"text": "GB/T 32403.1-2015"

1、调研

现在用的ik分词器效果

POST _analyze
{"analyzer": "ik_max_word","text": "GB/T 32403.1-2015"
}
{"tokens" : [{"token" : "gb","start_offset" : 0,"end_offset" : 2,"type" : "ENGLISH","position" : 0},{"token" : "t","start_offset" : 3,"end_offset" : 4,"type" : "ENGLISH","position" : 1},{"token" : "32403.1-2015","start_offset" : 5,"end_offset" : 17,"type" : "LETTER","position" : 2},{"token" : "32403.1","start_offset" : 5,"end_offset" : 12,"type" : "ARABIC","position" : 3},{"token" : "2015","start_offset" : 13,"end_offset" : 17,"type" : "ARABIC","position" : 4}]
}

发现并没有将32403.1分出来,导致检索32403就检索不到数据

解决方案:使用自定义分词器

我们使用的Unicode进行正则匹配,Unicode将字符编码分为了七类,其中

  • P代表标点
  • L 代表字母
  • Z 代表分隔符(空格,换行)
  • S 代表数学符号,货币符号
  • M代表标记符号
  • N 阿拉伯数字,罗马数字
  • C其他字符

例如:所以\pP的作用是匹配中英文标点,比如, . > 》?,而\pS代表的是数学符号,货币符号等

#自定义分词器
PUT punctuation_analyzer
{"settings": {"analysis": {"analyzer": {"punctuation_analyzer":{"type":"custom","tokenizer": "punctuation"}},"tokenizer": {"punctuation":{"type":"pattern","pattern":"[\\pP\\pZ\\pS]"}}}}
}

测试分词器效果

POST punctuation_analyzer/_analyze
{"analyzer": "punctuation_analyzer","text": "GB/T 32403.1-2015"
}
{"tokens" : [{"token" : "GB","start_offset" : 0,"end_offset" : 2,"type" : "word","position" : 0},{"token" : "T","start_offset" : 3,"end_offset" : 4,"type" : "word","position" : 1},{"token" : "32403","start_offset" : 5,"end_offset" : 10,"type" : "word","position" : 2},{"token" : "1","start_offset" : 11,"end_offset" : 12,"type" : "word","position" : 3},{"token" : "2015","start_offset" : 13,"end_offset" : 17,"type" : "word","position" : 4}]
}

发现效果符合我们的需求

2、使用新索引替换旧索引

1、新建工具人索引:old_copy

新建之前需要将旧的设置和索引查出来

#单独查询某个索引的设置
GET /testnamenew/_settings
#查询testnamenew索引的document的结构
GET /testnamenew/_mapping

使用命令

PUT /old_copy
{"settings": {//这里使用上面查出来的settings},"mappings": {//这里使用上面查出来的mappings}
}

拷贝数据
wait_for_completion=false 表示使用异步,因为有可能数据量太大,ES默认1分钟超时

POST _reindex?slices=9&refresh&wait_for_completion=false
{"source": {"index": "old"},"dest": {"index": "old_copy"}
}//查看任务进度
GET /_tasks/m-o_8yECRIOiUwxBeSWKsg:132452

2、删除old索引

DELETE std_v3

3、新建old索引,并添加自定义分词器

对比:

old的mapping,可以看到使用的ik

"name": {"type": "text","fields": {"keyword": {"type": "keyword"}},"analyzer": "ik_max_word","search_analyzer": "ik_smart"
},

使用自定义分词器

PUT /mapping_analyzer
{"settings": {"analysis": {"analyzer": {"punctuation_analyzer":{// 分词器的名字"type":"custom", //类型是自定义的"tokenizer": "punctuation" //分词组件是punctuation,下面自定义的}},"tokenizer": {"punctuation":{"type":"pattern","pattern":"[\\pP\\pZ\\pS]"}}}},"mappings": {"dynamic": "strict","properties": {"name": {"type": "text","analyzer": "punctuation_analyzer","search_analyzer": "punctuation_analyzer"}}}
}

4、数据迁移

POST _reindex?slices=9&refresh&wait_for_completion=false
{"source": {"index": "old_copy"},"dest": {"index": "old"}
}//查看任务进度
GET /_tasks/m-o_8yECRIOiUwxBeSWKsg:132452

测试效果

插入一条数据,如果有数据可跳过

PUT /old/_doc/1
{"name": "GB/T 32403.1-2015"
}
GET /old/_search
{"query": {"match": {"name": "32403"}}
}
{"took" : 5,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 0.2876821,"hits" : [{"_index" : "mapping_analyzer","_type" : "_doc","_id" : "1","_score" : 0.2876821,"_source" : {"name" : "GB/T 32403.1-2015"}}]}
}

成功命中

5、最后有个小bug

当我处理好之后上线测试,发现还是搜不到,发现代码里面指定的索引名是别名
立马加上,搞定

POST _aliases
{"actions": [{"add": {"index": "old","alias": "dd" //填别名}}]
}

6、附加内容

#自定义分词器
PUT myindex    自己定义一个索引
{"settings": {      # 在setting里面配置分词配置"analysis": {"analyzer": {"my_div_analyzer":{   # 分词器的名字叫my_div_analyzer"type":"custom",  # 类型是自定义的"char_filter":["emoticons"],  # 过滤器是emoticons,下面自定义的"tokenizer": "punctuation",   # 分词组件是punctuation,下面自定义的"filter":[                    # 过滤器是大写转小写的,还有english_stop,这个english_stop是自己下面定义的"lowercase","english_stop"]}},"tokenizer": {"punctuation":{  # 自己定义的,名字自取。类型就是正则匹配,正则表达式自己写就行,按照逗号分词"type":"pattern","pattern":"[.,!?]"}},"char_filter": {"emoticons":{ # 自己定义的,名字自取,类型是mapping的,笑脸转为happy,哭脸是sad"type" : "mapping","mappings" : [":) => _happy_",":( => _sad_"]}},"filter": {"english_stop":{ # 自己定义的,名字自取,类型就是stop,禁用词类型是_english_,前面有说是默认的"type":"stop","stopwords":"_english_"}}}}
}

结果

POST myindex/_analyze
{"analyzer": "my_div_analyzer","text": "I  am a :) person,and you?"
}
分词结果是:
{"tokens" : [{"token" : "i  am a _happy_ person","start_offset" : 0,"end_offset" : 17,"type" : "word","position" : 0},{"token" : "and you","start_offset" : 18,"end_offset" : 25,"type" : "word","position" : 1}]
}
我们看到大写被转了小写,笑脸被转了happy,而且分词分开的也是按逗号分开的,这就是我们定义分词器的效果。

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

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

相关文章

Java 反射

反射 Java 的反射( reflection )机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获…

一.安装k8s环境

1.初始操作 默认3台服务器都执行 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 关闭selinux sed -i s/enforcing/disabled/ /etc/selinux/config # 永久 setenforce 0 # 临时# 关闭swap swapoff -a # 临时 sed -ri s/.*swap.*/#&/ /etc/fstab…

QT--day3(定时器事件、对话框)

头文件代码&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器事件处理时间头文件 #include <QTime> //时间类 #include <QtTextToSpeech> #include <QPushButton> #include <QLabel&g…

【数据结构】实验六:队列

实验六 队列 一、实验目的与要求 1&#xff09;熟悉C/C语言&#xff08;或其他编程语言&#xff09;的集成开发环境&#xff1b; 2&#xff09;通过本实验加深对队列的理解&#xff0c;熟悉基本操作&#xff1b; 3&#xff09; 结合具体的问题分析算法时间复杂度。 二、…

ubuntu23.04 flush DNS caches

如何在Ubuntu 23.04中刷新DNS缓存 现在&#xff0c;如果你运行的是Ubuntu 23.04&#xff0c;"系统解决 "的方法将不再适用于你。让我们检查一下你目前的缓存大小。打开你的Ubuntu终端&#xff0c;运行以下command&#xff1a; resolvectl statistics现在&#xff0c…

mysql主从同步怎么跳过错误

今天介绍两种mysql主从同步跳过错误的方法&#xff1a; 一、两种方法介绍 1、跳过指定数量的事务&#xff1a; mysql>slave stop; mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER 1 #跳过一个事务 mysql>slave start2、修改mysql的配置文件&#xff0c;通过slav…

【QT 网络云盘客户端】——实现文件属性窗口

目录 文件属性对话框 设置字体样式 获取文件的信息 显示文件属性对话框 当我们点击文件中的属性&#xff0c;则会弹出一个属性对话框&#xff1a; 实现过程&#xff1a; 0.设置 属性 菜单项的槽函数。 1.鼠获取鼠标选中的QListWidgetItem,它包含 图标和文件名 2.根据文件…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 数据压缩和打包处理与数据更新

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

十一、数据结构——树(Tree)的基本概念

数据结构之树(Tree) 目录 树的基本概念树的分类树的基本操作树的应用结语 树的基本概念 树是一种重要的数据结构&#xff0c;它在计算机科学中被广泛应用。树的特点是以分层的方式存储数据&#xff0c;具有层次结构&#xff0c;类似于现实生活中的树状结构。在树中&#xff…

python与深度学习(十):CNN和cifar10二

目录 1. 说明2. cifar10的CNN模型测试2.1 导入相关库2.2 加载数据和模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章训练的模型进行测试。首…

JPA之Hibernate

JPA 定义&#xff1a;是 JavaEE 中一组用于持久化数据的 API&#xff0c;它提供了一种标准的 ORM 规范&#xff0c;用于 Java 对象映射到数据库中。 JPA 的开发是为了简化企业级应用程序的开发&#xff0c;降低应用程序与数据库之间的耦合度&#xff0c;并提高应用程序的可维护…

【Vuvuzela 声音去噪算法】基于流行的频谱减法技术的声音去噪算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

WEB:unseping

背景知识 php序列化和反序列化 命令执行绕过方式 题目 进行代码审计 可知为反序列化 整体是创建case类&#xff0c;可接受post传来的ctf值 _consturuct函数,是在函数调动前启用&#xff0c;构造了$method和$args两个变量。 _dexstruct函数在变量摧毁的时使用&#xff0c;所…

【嵌入式学习笔记】嵌入式基础10——STM32时钟配置

1.认识时钟树 简单来说&#xff0c;时钟是具有周期性的脉冲信号&#xff0c;最常用的是占空比50%的方波 1.1.F1的时钟树 1.2.F4的时钟树(407为例) 1.3.F7的时钟树 1.4.H7的时钟树 2.配置系统时钟(F1为例) 2.1.系统时钟配置步骤 配置HSE VALUE&#xff1a;告诉HAL库外部晶振…

2021 年高教社杯全国大学生数学建模竞赛 E 题 中药材的鉴别 第一题

目录 1.数据预处理 1.1 数据基本信息探索 1.2 数据可视化 1.3 异常值处理 2. 数据特征值提取 2.1 数据标准化 2.2 PCA提取特征值 3. 数据聚类鉴别药材种类 3.1 肘部图确定K值 3.2 轮廓系数图确定K值 3.3 数据聚类 3.4 聚类结果可视化 4. 研究不同种类药材…

vue-element-plus-admin框架的tag上下文切换bug

问题 首先贴上该框架的链接&#xff1a;https://github.com/kailong321200875/vue-element-plus-admin 在对路由进行部分修改后&#xff0c;网站多次切换tag时&#xff0c;控制台会出现报错&#xff1a;Cannot read properties of undefined (reading offsetLeft)。 我在框架…

SQL基础培训24-存储过程详解

1.存储过程的概念与语法 1.1.概念 存储过程(Stored Procedure):已预编译为一个可执行过程的一个或多个SQL语句的集合。 1.2.语法 创建测试表: create table student <

jdk11环境 提示“因为 accessExternalDTD 属性设置的限制导致不允许 ‘http‘ 访问“bug

在运行mybatis源码的时候&#xff0c;提示一下错误&#xff1a; Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### Cause: org.apache.ibatis.builder.BuilderException: Error creating docum…

CentOS下 Docker、Docker Compose 的安装教程

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。 Docker Compose是用于定义…

C语言基础入门详解一

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 前言&#xff1a; 初识C语言 //#include 相当于java的import,stdio全称&#xff1a;st…