ES-分词器

article/2025/9/12 18:39:39

简介

分词器是es中的一个组件,通俗意义上理解,就是将一段文本按照一定的逻辑,分析成多个词语,同时对这些词语进行常规化的一种工具;ES会将text格式的字段按照分词器进行分词,并编排成倒排索引,正是因为如此,es的查询才如此之快。

一个analyzer即分析器,无论是内置的还是自定义的,只是一个包含character filters(字符过滤器)、 tokenizers(分词器)、token filters(令牌过滤器)三个细分模块的包。

看下这三个细分模块包的作用:

character filters(字符过滤器):分词之前的预处理,过滤无用字符

token filters(令牌过滤器):停用词、时态转换,大小写转换、同义词转换、语气词处理等。

tokenizers(分词器):切词

自定义分词器

先来看个自定义分词器,了解整个分析器analyzer的构造

PUT custom_analysis
{"settings":{"analysis":{	#分析配置,可以设置char_filter(字符过滤器)、filter(令牌过滤器)、tokenizer(分词器)、analyzer(分析器)"char_filter": { # 字符过滤器配置"my_char_filter":{ #定义一个字符过滤器:my_char_filter"type":"mapping", # 字符过滤器类型:主要有三种:html_strip(标签过滤)、mapping(字符替换)、pattern_replace(正则匹配替换)"mappings":[	# mapping的参数:表示 '&' 会被替换成 'and'"& => and","| => or"]},"html_strip_char_filter":{"type":"html_strip","escaped_tags":["a"]}},"filter": {	# 令牌过滤器配置"my_stopword":{ # 定义一个令牌过滤器:my_stopword"type":"stop", # 令牌过滤器类型:stop(停用(删除)词)"stopwords":[	# stop的参数:表示这些词会被删除"is","in","the","a","at","for"]}},"tokenizer": {	# 分词器配置"my_tokenizer":{ # 定义一个分词器my_tokenizer"type":"pattern", # 分词器类型:pattern 正则匹配"pattern":"[ ,.!?]" # pattern的参数:会根据这几个字符进行分割}},"analyzer": {	# 分析器:可以理解成组合了字符过滤器、令牌过滤器、分词器的一个整体。"my_analyzer":{ #定义一个分析器:my_analyzer"type":"custom", "char_filter":["my_char_filter","html_strip_char_filter"], # 使用的字符过滤器"filter":["my_stopword"], # 使用的令牌过滤器"tokenizer":"my_tokenizer" # 使用的分词器}}}}
}

字符过滤器(character filters)

字符过滤器是分词之前的预处理,过滤无用字符,主要有这三种:html_strip、mapping、pattern_replace

html_strip

html_strip用于过滤html标签,它有个参数escaped_tags可以设置保留的标签

看下面例子

PUT index_html_strip
{"settings": {"analysis": {"char_filter": {"my_char_filter":{"type":"html_strip","escaped_tags":["a"] }},"analyzer": {"my_analyzer":{"tokenizer":"keyword","char_filter":["my_char_filter"]}}}}
}
GET my_index/_analyze
{"analyzer": "my_analyzer","text": "<p>要的话就<a>点击</a></p>"
}

结果:p标签过滤掉了,而a标签保留了

mapping

mapping是字符替换

看下面例子,可以设置一些敏感词替换成*

PUT index_mapping
{"settings": {"analysis": {"char_filter": {"my_char_filter":{"type":"mapping","mappings":["滚 => *","垃圾 => *","手枪 => *","你妈 => *"] }},"analyzer": {"my_analyzer":{"tokenizer":"keyword","char_filter":["my_char_filter"]}}}}
}
GET index_mapping/_analyze
{"analyzer": "my_analyzer","text": "你妈的,小垃圾,拿上你的手枪,滚远点!"
}

结果:可以看到设置的敏感词被替换成*了

pattern_replace

pattern_replace是正则匹配替换

可以匹配手机号码,将中间四个数字加密处理

PUT index_pattern_replace
{"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 index_pattern_replace/_analyze
{"analyzer": "my_analyzer","text": "你的手机号是18814142694"
}

结果:

令牌过滤器(token filters)

停用词(stop)、大小写转换(lowercase)、同义词转换(synonym)等。

stop-停用词

停用词有个参数可以设置删除的词语:stopwords

PUT /index_stop
{"settings": {"analysis": {"analyzer": {"my_stop": {"tokenizer": "whitespace","filter": [ "my_stop" ]}},"filter": {"my_stop": {"type": "stop","stopwords": ["is","in","the","a","at","for"]}}}}
}
GET index_stop/_analyze
{"analyzer": "my_stop","text": ["What is a apple?"]
}

结果:

synonym-同义词

同义词过滤器需要配置同义词的文件路径synonyms_path,需要放在项目目录下的config文件目录里

(本项目同义词文件完整路径:/app/elasticsearch-8.4.2/config/analysis/synonym.txt)

蒙丢丢 => 'DaB'
PUT /index_synonym
{"settings": {"analysis": {"analyzer": {"synonym": {"tokenizer": "whitespace","filter": [ "synonym" ]}},"filter": {"synonym": {"type": "synonym","synonyms_path": "analysis/synonym.txt"}}}}
}
GET index_synonym/_analyze
{"analyzer": "synonym","text": ["蒙丢丢"]
}

结果:

分词器(tokenizer)

分词器的作用就是用来切词的。

常见的分词器有:

standard:默认分词器,中文支持的不理想,会逐字拆分

pattern:以正则匹配分隔符,把文本拆分成若干词项

simple pattern:以正则匹配词项,速度比pattern tokenizer快

whitespace:以空白符分割

GET _analyze
{"analyzer": "whitespace","text": ["What is a apple?"]
}

结果

中文分词器

ES的中文分词器需要下载插件安装使用的。

安装&部署

ik下载地址:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.


点击Releases,选择版本下载


在根目录下的plugins文件夹下,创建ik文件目录,将下载的插件解压到ik目录下

ik配置文件说明

IKAnalyzer.cfg.xml:IK分词配置文件
main.dic:主词库:
stopword.dic:英文停用词,不会建立在倒排索引中
quantifier.dic:特殊词库:计量单位等
suffix.dic:特殊词库: 后级名
surname.dic: 特殊词库: 百家姓
preposition:特殊词库: 语气词
自定义词库:网络词汇、流行词、自造词等

重启ES

/app/elasticsearch-8.4.2/bin/elasticsearch -d
/app/kibana-8.4.2/bin/kibana &

使用

GET _analyze
{"analyzer": "ik_max_word",  #中文分词器:ik_max_word"text": ["今天真是美好的一天"]
}

结果

{"tokens": [{"token": "今天","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "天真","start_offset": 1,"end_offset": 3,"type": "CN_WORD","position": 1},{"token": "真是","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 2},{"token": "美好","start_offset": 4,"end_offset": 6,"type": "CN_WORD","position": 3},{"token": "的","start_offset": 6,"end_offset": 7,"type": "CN_CHAR","position": 4},{"token": "一天","start_offset": 7,"end_offset": 9,"type": "CN_WORD","position": 5},{"token": "一","start_offset": 7,"end_offset": 8,"type": "TYPE_CNUM","position": 6},{"token": "天","start_offset": 8,"end_offset": 9,"type": "COUNT","position": 7}]
}


http://chatgpt.dhexx.cn/article/FChGqYpv.shtml

相关文章

IK分词器

IK分词器是ES的一个插件&#xff0c;主要用于把一段中文或者英文的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分词器是将每个字看成一个词,比如"我爱技术"会被分为"我…

Elasticsearch连续剧之分词器

目录 一、前言二、默认分词器三、IK分词器1.主要算法2.安装IK分词器2.1 关闭es服务2.2 上传ik分词器到虚拟机2.3 解压2.4 启动ES服务2.5 测试分词器效果2.6 IK分词器词典 四、拼音分词器1.安装2.测试分词效果 五、自定义分词器1.创建自定义分词器2.测试 一、前言 ES文档的数据…

jieba分词

一、jieba简介 jieba库是一款优秀的 Python 第三方中文分词库&#xff0c;jieba 支持三种分词模式&#xff1a;精确模式、全模式和搜索引擎模式&#xff0c;下面是三种模式的特点。 精确模式&#xff1a; 试图将语句最精确的切分&#xff0c;不存在冗余数据&#xff0c;适合做…

NLP-分词综述

NLP-分词综述 一、什么是分词&#xff1f;二、为什么要分词1、将复杂问题转化为数学问题2. 词是⼀个⽐较合适的粒度3. 深度学习时代&#xff0c;部分任务中也可以「分字」 三、中英⽂分词的3个典型区别1.分词⽅式不同&#xff0c;中⽂更难2.英⽂单词有多种形态3.中⽂分词需要考…

Jieba中文分词 (一) ——分词与自定义字典

jieba分词特点 支持四种分词模式&#xff1a; 精确模式试图将句子最精确地切开&#xff0c;适合文本分析&#xff1b;全模式把句子中所有的可以成词的词语都扫描出来, 速度非常快&#xff0c;但是不能解决歧义&#xff1b;搜索引擎模式在精确模式的基础上&#xff0c;对长词再次…

【NLP学习】中文分词

word segmentation 1.概述2.分词方法(1)基于词典的机械分词法①正向最大匹配&#xff08;FMM&#xff09;②逆向最大匹配&#xff08;BMM&#xff09;③双向最大匹配 (2)基于统计的分词法①基于互信息的分词方法②最大概率分词方法 3.分词粒度4.中文分词工具5.总结 1.概述 *◆…

基于字典的中文分词

中文分词介绍 中文分词就是将一个汉语句子中的词切分出来。为机器翻译、文本挖掘、情感分析等任务打好基础。为什么一定要先进行分词呢&#xff1f;这就像 26 个字母一样&#xff0c;单个字母并不能表达某个意思&#xff0c;将其组合起来成为一个英文单词才有意义。 中文虽然有…

【ElasticSearch】中文分词器

ES默认的analyzer&#xff08;分词器&#xff09;&#xff0c;对英文单词比较友好&#xff0c;对中文分词效果不好。不过ES支持安装分词插件&#xff0c;增加新的分词器。 1、如何指定analyzer&#xff1f; 默认的分词器不满足需要&#xff0c;可以在定义索引映射的时候&#…

Elasticsearch之中文分词器

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【一心同学】&#xff0c;一位上进心十足的【Java领域博主】&#xff01;&#x1f61c;&#x1f61c;&#x1f61c; ✨【一心同学】的写作风格&#x…

各种中文分词工具的使用方法

诸神缄默不语-个人CSDN博文目录 本文将介绍jieba、HanLP、LAC、THULAC、NLPIR、spacy、stanfordcorenlp、pkuseg等多种中文分词工具的简单使用方法。 对于可以在多种语言上使用的工具&#xff0c;本文仅介绍其在Python语言上的使用。 文章目录 1. jieba2. HanLP3. LAC4. THULA…

中文分词方法

词条化 分词又叫做词条化&#xff08;tokenlize&#xff09;&#xff0c;指的是将原始的字符流转换成一个一个词条&#xff08;token&#xff09;的过程。词条化属于自然语言处理中预处理的一个步骤&#xff0c;它是分析语义的基础。下图是一个词条化的例子。 在不同的语言中&…

细说中文分词

完整的中文自然语言处理过程一般包括以下五种中文处理核心技术&#xff1a;分词、词性标注、命名实体识别、依存句法分析、语义分析。其中&#xff0c;分词是中文自然语言处理的基础&#xff0c;搜素引擎、文本挖掘、机器翻译、关键词提取、自动摘要生成等等技术都会用到中文分…

【Grails4+spring security】

Grails4spring security实现单用户登录 描述1、新建项目目录结构如图所示2、打开根目录下的build.gradle文件&#xff0c;dependencies中添加spring-security依赖3、创建用户、角色的domain4、创建登录控制器LoginController5、创建注销控制器 LogoutController6、自定义一个Co…

Grails配置-基本配置-如何覆盖默认配置,在哪里进行自定义配置

文章目录 Grails配置基本配置⎮Grails4风格配置⎮Grails2风格的Groovy配置⎮使用GrailsApplication对象访问配置信息 在控制器中使用grailsApplication对象 能获取到的配置信息有哪些 在业务层中使用grailsApplication对象方式一 在业务层中使用grailsApplication对象方式二…

Grails 的插件开发

警告&#xff1a;本文还未整理&#xff0c;可读性差&#xff0c;还只是草稿 文档 Grails Plugin Develop Document grails-spring-security-core 插件文档 grails-spring-security-rest插件 文档 创建插件 执行命令行 grails create-plugin <<PLUGIN NAME>>即…

Grails配置-启动类配置,数据源配置,连接Mysql数据库

文章目录 Grails配置1. 启动类配置Application.groovy启动类中可以做哪些事情1. 启动Grails应用程序2. 自定义包扫描路径3. 注册bean4. 应用程序生命周期管理 2. 环境配置2.1 默认的多环境配置2.2 预设的环境2.3 打包和运行使用不同的环境2.4 在代码启动过程中判断当前环境2.5 …

java grails mave_Grails 与 Maven 集成

Grails 与 Maven 集成 杨 健 2013 年 9 月 09 日发布 概述 Grails 简介&#xff1a;Grails 是一个开源的 Web 开发框架&#xff0c;它采用动态语言 Groovy 进行开发&#xff0c;并且可以和用 Java 开发的项目进行集成。Grails 充分体现了约定优于配置的原则&#xff0c;将项目的…

Grails4.0.11入门

文章目录 Grails4.0.11介绍相关依赖入门⎮Java环境搭建⎮Grails环境搭建⎮如何创建grails应用⎮如何选择开发工具IDEA如何导入Grails项目 ⎮目录结构&#xff0c;约定优于配置⎮如何部署Grails项目1. 使用默认内嵌的Tomcat8部署2. 使用外部Tomtcat8部署3. 使用外部Tomcat7部署 …

grails java_Grails

十二、Grails 如今的Java Web开发对于需求来说已经变得过于复杂。当今众多Java领域的Web开发框架不仅使用复杂&#xff0c;而且并没有很好的遵循Don’t Repeat Yourself(DRY)原则。像Rails&#xff0c;Django和TurboGears这样的动态框架在Web开发领域开辟了一条新的道路&#x…

JAVA AIO编程

Asynchronous IO&#xff1a; 异步非阻塞的编程方式 与NIO不同&#xff0c;当进行读写操作时&#xff0c;只须直接调用API的read或write方法即可。这两种方法均为异步的&#xff0c;对于读操作而言&#xff0c;当有流可读取时&#xff0c;操作系统会将可读的流传入read方法的缓…