Elasticsearch-分词器详解

什么是分词器

1、分词器介绍 对文本进行分析处理的一种手段,基本处理逻辑为按照预先制定的分词规则,把原始文档分割成若干更小粒度的词项,粒度大小取决于分词器规则。
常用的中文分词器有ik按照切词的粒度粗细又分为:ik_max_word和ik_smart;英文分词器standard
ik_max_word会将文本做最细粒度的拆分,会穷尽各种可能的组合,适合 Term Query;
ik_smart:会做最粗粒度的拆分,适合 Phrase 查询
下面是对分词器使用的语句:

GET _analyze
{"text": ["布布努力学习编程"],"analyzer": "ik_max_word"
}
{"tokens" : [{"token" : "布","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "布","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "努力学习","start_offset" : 2,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "努力","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 3},{"token" : "力学","start_offset" : 3,"end_offset" : 5,"type" : "CN_WORD","position" : 4},{"token" : "学习","start_offset" : 4,"end_offset" : 6,"type" : "CN_WORD","position" : 5},{"token" : "编程","start_offset" : 6,"end_offset" : 8,"type" : "CN_WORD","position" : 6}]
}GET _analyze
{"text": ["布布努力学习编程"],"analyzer": "ik_smart"
}
{"tokens" : [{"token" : "布","start_offset" : 0,"end_offset" : 1,"type" : "CN_CHAR","position" : 0},{"token" : "布","start_offset" : 1,"end_offset" : 2,"type" : "CN_CHAR","position" : 1},{"token" : "努力学习","start_offset" : 2,"end_offset" : 6,"type" : "CN_WORD","position" : 2},{"token" : "编程","start_offset" : 6,"end_offset" : 8,"type" : "CN_WORD","position" : 3}]
}GET _analyze
{"text": ["布布努力学习编程"],"analyzer": "standard"
}
{"tokens" : [{"token" : "布","start_offset" : 0,"end_offset" : 1,"type" : "<IDEOGRAPHIC>","position" : 0},{"token" : "布","start_offset" : 1,"end_offset" : 2,"type" : "<IDEOGRAPHIC>","position" : 1},{"token" : "努","start_offset" : 2,"end_offset" : 3,"type" : "<IDEOGRAPHIC>","position" : 2},{"token" : "力","start_offset" : 3,"end_offset" : 4,"type" : "<IDEOGRAPHIC>","position" : 3},{"token" : "学","start_offset" : 4,"end_offset" : 5,"type" : "<IDEOGRAPHIC>","position" : 4},{"token" : "习","start_offset" : 5,"end_offset" : 6,"type" : "<IDEOGRAPHIC>","position" : 5},{"token" : "编","start_offset" : 6,"end_offset" : 7,"type" : "<IDEOGRAPHIC>","position" : 6},{"token" : "程","start_offset" : 7,"end_offset" : 8,"type" : "<IDEOGRAPHIC>","position" : 7}]
}

分词器的生效时间

  1. 在创建索引的时候会把索引中text类型的字段按照mapping中配置的分词器进行分词存储倒排索引;
  2. 在查询的时候全文检索,会对搜索条件进行分词做为查询条件去和创建索引时的分词匹配;

分词器的组成

切词器(Tokenizer):用于定义切词(分词)逻辑
词项过滤器(Token Filter):用于对分词之后的单个词项的处理逻辑
字符过滤器(Character Filter):用于处理单个字符
注意:分词器不会对源数据产生影响,分词只是对倒排索引以及搜索词的行为

字符过滤器(Character Filter)

定义:分词之前的预处理,过滤无用字符
字符过滤器分为三种:

字符过滤器-HTML标签过滤器:HTML Strip Character Filter

过滤html标签

html_strip
参数:escaped_tags 需要保留的html标签
“type”: “html_strip”

DELETE test_html_strip_filter
#字符过滤器
PUT test_html_strip_filter
{"settings": {"analysis": {"char_filter": {"my_char_filter": {"type": "html_strip","escaped_tags": ["a"]}}}}
}GET test_html_strip_filter/_analyze
{"tokenizer": "standard","char_filter": ["my_char_filter"],"text": ["<p>I&apos;m so <a>happy</a>!</p>"]
}结果:
{"tokens" : [{"token" : "I'm","start_offset" : 3,"end_offset" : 11,"type" : "<ALPHANUM>","position" : 0},{"token" : "so","start_offset" : 12,"end_offset" : 14,"type" : "<ALPHANUM>","position" : 1},{"token" : "a","start_offset" : 16,"end_offset" : 17,"type" : "<ALPHANUM>","position" : 2},{"token" : "happy","start_offset" : 18,"end_offset" : 23,"type" : "<ALPHANUM>","position" : 3},{"token" : "a","start_offset" : 25,"end_offset" : 26,"type" : "<ALPHANUM>","position" : 4}]
}

上面语句的作用是:对text文本,只保留标签,其余标签不展示

字符过滤器-字符映射过滤器:Mapping Character Filter

通过在索引的mapping映射中指定对某些字符的替换从而完成特定字符的过滤
“type”:“mapping”

##Mapping Character Filter 
DELETE my_index
PUT my_index
{"settings": {"analysis": {"char_filter": {"my_char_filter":{"type":"mapping","mappings":["臭 => *","傻=> *","逼=> *"]}},"analyzer": {"my_analyzer":{"tokenizer":"keyword","char_filter":["my_char_filter"]}}}}
}
GET my_index/_analyze
{"analyzer": "my_analyzer","text": "你就是个臭傻逼"
}{"tokens" : [{"token" : "你就是个***","start_offset" : 0,"end_offset" : 7,"type" : "word","position" : 0}]
}

字符过滤器-正则替换过滤器:Pattern Replace Character Filter

“type”:"pattern_replace"表示正则替换

##Pattern Replace Character Filter 
#17611001200
DELETE my_index
PUT my_index
{"settings": {"analysis": {"char_filter": {"my_char_filter":{"type":"pattern_replace","pattern":"(\\d{3})\\d{4}(\\d{4})","replacement":"$1****$2"}},"analyzer": {"my_analyzer":{"tokenizer":"keyword","char_filter":["my_char_filter"]}}}}
}
GET my_index/_analyze
{"analyzer": "my_analyzer","text": "您的手机号是17611001200"
}{"tokens" : [{"token" : "您的手机号是184****6831","start_offset" : 0,"end_offset" : 17,"type" : "word","position" : 0}]
}

词项过滤器(Token Filter)

词项过滤器用来处理切词完成之后的词项,例如把大小写转换,删除停用词或同义词处理等。官方同样预置了很多词项过滤器,基本可以满足日常开发的需要。当然也是支持第三方也自行开发的。

standard转大小写、停用词

#转为大写
GET _analyze
{"tokenizer": "standard", "filter": ["uppercase"],"text": ["www elastic co guide"]
}#转为小写
GET _analyze
{"tokenizer": "standard","filter": ["lowercase"],"text": ["WWW ELASTIC CO GUIDE"]
}

停用词
在切词完成之后,会被干掉词项,即停用词。停用词可以自定义
在分词器插件的配置文件中可以看到停用词的定义


GET _analyze
{"tokenizer": "standard","filter": ["stop"], "text": ["what are you doing"]
}

这是IK分词器的停用词
在这里插入图片描述
自定义停用词

### 自定义 filter
PUT test_token_filter_stop
{"settings": {"analysis": {"filter": {"my_filter": {"type": "stop","stopwords": ["www"],"ignore_case": true}}}}
}
GET test_token_filter_stop/_analyze
{"tokenizer": "standard", "filter": ["my_filter"], "text": ["What www WWW are you doing"]
}

同义词

#同义词
PUT test_token_filter_synonym
{"settings": {"analysis": {"filter": {"my_synonym": {"type": "synonym","synonyms": ["good, nice => excellent"]}}}}
}GET test_token_filter_synonym/_analyze
{"tokenizer": "standard", "filter": ["my_synonym"], "text": ["good"]
}

切词器:Tokenizer

tokenizer 是分词器的核心组成部分之一,其主要作用是分词,或称之为切词。主要用来对原始文本进行细粒度拆分。拆分之后的每一个部分称之为一个 Term,或称之为一个词项。可以把切词器理解为预定义的切词规则。官方内置了很多种切词器,默认的切词器为 standard。

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

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

相关文章

CE之植物大战僵尸植物无冷却

思路&#xff1a;先扫描所有的未知道初始化的值&#xff0c;一般是4字节&#xff0c;然后我们先种植一棵植物再通过CE扫描不断变化的值&#xff0c;等植物冷却结束后再去扫描未变化的值&#xff0c;重复操作。然后找到冷却值&#xff0c;然后通过汇编的方式去编写nop代码&#…

Datawhale AI冬令营——Chat-悟空设计

Chat - 悟空项目介绍 一、项目背景 当前大模型市场竞争激烈&#xff0c;通用大模型众多&#xff0c;但针对特定领域、具有特色风格的垂直领域微调模型仍有较大发展空间。以《西游记》这一高人气影视IP为依托进行微调&#xff0c;能在文化娱乐相关细分市场吸引用户关注&#xf…

微服务分布式(二、注册中心Consul)

首先我们需要安装consul,到官网下载Consul Install | Consul | HashiCorp Developer 在解压的consul目录下 执行启动命令 consul agent -dev 启动服务 -dev表示开发模式 -server表示服务模式 启动后在浏览器访问8500端口http://localhost:8500/可以看到服务管理界面 项目…

Java基于SSM框架的无中介租房系统小程序【附源码、文档】

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

Activiti开启流程实例

开始绘流程图&#xff0c;首先右击鼠标可以看到一下图标&#xff0c;都有相对应的意思 画好一个简易的流程过后&#xff0c;可以看到xml文件中已经有了 右击生成png格式的图片 图片点击后就是一个视图的效果 将流程文件部署 Test public void testDeploy() {//1.创建流程引擎P…

ECharts柱状图-柱图42,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

解锁移动设备管理新技能-RayLink远程控制手机

在这个忙碌的现代社会中&#xff0c;智能手机已经成为我们生活的重要组成部分&#xff0c;它们不再仅仅是通讯工具&#xff0c;而是我们日常生活的核心。随着这种变化&#xff0c;远程控制手机的技术应运而生&#xff0c;为我们开启了一个全新的移动设备管理时代。今天&#xf…

基于DockerCompose搭建Redis主从哨兵模式

linux目录结构 内网配置 哨兵配置文件如下&#xff0c;创建3个哨兵配置文件 # sentinel26379.conf sentinel26380.conf sentinel26381.conf 内容如下 protected-mode no sentinel monitor mymaster redis-master 6379 2 sentinel down-after-milliseconds mymaster 60000 s…

c++--------c++概念

定义与起源 C是一种高级编程语言&#xff0c;它是C语言的扩展。C由Bjarne Stroustrup在20世纪80年代初开发&#xff0c;最初被称为“C with Classes”。其设计目的是在保持C语言高效性的同时&#xff0c;增加面向对象编程&#xff08;OOP&#xff09;的特性。例如&#xff0c;…

【优选算法---归并排序衍生题目】剑指offer51---数组中的逆序对、计算右侧小于当前元素的个数、翻转对

一、剑指offer51---数组中的逆序对 题目链接: LCR 170. 交易逆序对的总数 - 力扣&#xff08;LeetCode&#xff09; 题目介绍&#xff1a; 在数组中的两个数字&#xff0c;如果前面⼀个数字大于后面的数字&#xff0c;则这两个数字组成⼀个逆序对。输入一个数组&#xff0c…

C++算法第十二天

本篇文章&#xff0c;我们继续学习动态规划 第一题 题目链接 面试题 17.16. 按摩师 - 力扣&#xff08;LeetCode&#xff09; 题目解析 代码原理 代码编写 细节问题处理 这里的细节问题就是当n 0时的这种情况 完整源代码 class Solution { public: int massage(vector&…

java全栈day20--Web后端实战(Mybatis基础2)

一、Mybatis基础 1.1辅助配置 配置 SQL 提示。 默认在 mybatis 中编写 SQL 语句是不识别的。可以做如下配置&#xff1a; 现在就有sql提示了 新的问题 产生原因&#xff1a; Idea 和数据库没有建立连接&#xff0c;不识别表信息 解决方式&#xff1a;在 Idea 中配置 MySQL 数…

2023年厦门市第30届小学生C++信息学竞赛复赛上机操作题(三、2023C. 太空旅行(travel))

#include <bits/stdc.h>using namespace std;struct Ship {int u; // 从地球到火星的时间int v; // 从火星到天王星的时间 };// 自定义比较函数 bool cmp(const Ship &a, const Ship &b) {return a.u max(a.v, b.u) b.v < b.u max(b.v, a.u) a.v; }int ma…

使用qemu搭建armv7嵌入式开发环境

目录 目录 1 概述 2 环境准备 2.1 vexpress系列开发板介绍 2.2 安装工具 2.2.1 安装交叉工具链 2.2.2 安装qemu 2.2.3 安装其他工具 3 启动uboot 3.1 uboot下载与编译 3.1.1 下载 3.1.2 编译 3.2 使用qemu启动uboot 4 启动kernel 4.1 下载和编译kernel 4.1.1 下…

CSDN外链失效3:

参考我之前的博客&#xff1a; 外链失效博客1&#xff1a;随想笔记1&#xff1a;CSDN写博客经常崩溃&#xff0c;遇到外链图片转存失败怎么办_csdn外链图片转存失败-CSDN博客 外链失效博客2&#xff1a;网络随想2&#xff1a;转语雀_md格式转语雀lake格式-CSDN博客 markdown…

《LangChain大模型应用开发》书籍分享

前言 ChatGPT和OpenAI开发的GPT模型不仅改变了我们的写作和研究方式&#xff0c;还改变了我们处理信息的方式。《LangChain大模型应用开发》讨论了聊天模式下的LLM的运作、能力和局限性&#xff0c;包括ChatGPT和Gemini。书中通过一系列实际例子演示了如何使用LangChain框架构…

Jenkins持续集成部署——jenkins安装

前言 Jenkins 是一个开源的自动化服务器&#xff0c;主要用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;。它为软件开发团队提供了一个易于使用的平台来自动化构建、测试和部署应用程序的过程。 Jenkins 主要功能 1. 持续集成 (CI) 自动构建…

飞牛 fnos 使用docker部署 bili-sync:打造自动化 B 站资源下载器,与主流媒体服务器无缝衔接

Bili-Sync介绍及相关部署操作 一、Bili-Sync概述 Bili-Sync是哔哩哔哩内容同步助手&#xff0c;它能借助用户提供的登录信息&#xff0c;定期对用户的视频合集以及个人收藏进行遍历&#xff0c;找出还没在本地保存的新内容&#xff0c;然后自动下载到本地存储&#xff0c;以此…

Idean 处理一个项目引用另外一个项目jar 但jar版本低的问题

当在idea中一个module A引用另外一个项目B的jar&#xff0c;但是从私服仓库中拉下的jar版本比较低导致编译不通过时&#xff0c;可以把项目B拉下来&#xff0c;重新编译打包jar跟新到本地的仓库 选中右边菜单的Maven 选中对应的项目B-》Lifecycle->双击 install也可以按住c…

【day11】面向对象编程进阶(继承)

概述 本文深入探讨面向对象编程的核心概念&#xff0c;包括继承、方法重写、this和super关键字的使用&#xff0c;以及抽象类和方法的定义与实现。通过本文的学习&#xff0c;你将能够&#xff1a; 理解继承的优势。掌握继承的使用方法。了解继承后成员变量和成员方法的访问特…