ES-分词器

news2024/11/25 21:25:08

简介

分词器是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://www.coloradmin.cn/o/13229.html

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

相关文章

Vben Admin 的介绍以及使用

Vben Admin 的介绍以及使用初识 Vben Admin一、安装vue-vben-admin二、vben admin 目录介绍1.运行项目好用的插件启动项目打开终端三 项目分析1. 路由配置新增路由四 : vben admin 的使用初识 Vben Admin Vben Admin官方文档地址 好像官网挂了 !! 嘤嘤嘤嘤嘤 因为最近业务需要…

蓝牙无线自制串口模块连接穿越机配置工具

蓝牙无线自制串口模块连接穿越机配置工具1. 目的2. 验证环境3. BLE SPP验证4. BT SPP验证5. 参考资料穿越机配置工具 SpeedyBeeBetaFlightConfigurator 目前&#xff0c;市面上连接BetaFlight给飞控固件调参比较顺手的工具大体上是官网的BetaFlight Configurator(国内都叫BF地…

OFD转PDF ~java实现

OFD转PDF ~java实现 当你在查这个问题时&#xff0c;说明大家都已经接触到OFD这个新的版式文档了。OFD格式对标的PDF&#xff0c;目前关于PDF的转换都比较成熟&#xff0c;但是当OFD出现后&#xff0c;切发现能实现转换却似乎有所困难。尝试网上搜了一下这方面的资料&#xff…

别再当大冤种了,揭开3D建模报班6个常见套路

1⃣承诺有就业保障 任何机构给你承诺✊所谓的包就业都是耍流氓&#x1f621;&#xff0c;请不要信❗️ 承诺就业保障的机构无非3种情况&#xff1a; &#x1f539;赚取学员的信任感&#xff0c;吸引学员报名和交钱&#xff1b; &#x1f538;提高机构的“专业度”和所谓的“…

JWT详解(文章内嵌jwt工具类)

JWT 基础概念详解&#xff0c;工具类和使用方法放在最后 什么是 JWT? JWT &#xff08;JSON Web Token&#xff09; 是目前最流行的跨域认证解决方案&#xff0c;是一种基于 Token 的认证授权机制。 从 JWT 的全称可以看出&#xff0c;JWT 本身也是 Token&#xff0c;一种规…

【现代密码学原理】——消息认证码(学习笔记)

&#x1f4d6; 前言&#xff1a;消息认证码 MAC&#xff08;Message Authentication Code&#xff09;是经过特定算法后产生的一小段信息&#xff0c;检查某段消息的完整性&#xff0c;以及作身份验证。它可以用来检查在消息传递过程中&#xff0c;其内容是否被更改过&#xff…

Appium 移动端自动化测试(Mac)

目录 adb调试工具&#xff08;Android Debug Bridge&#xff09; adb常用命令 Appium使用 快速体验步骤 Appium常用方法 UIAutomatorViewer 获取元素 元素等待&#xff08;在指定时间内一直等待 元素操作 Swipe 滑动和拖拽事件&#xff08;Scroll、drag_and_drop&#…

pytorch深度学习实战19

第十九课 卷积层的填充和步幅 目录 理论部分 实践部分 理论部分 首先看一下卷积层的填充。 上图所示的情况会有个问题&#xff0c;如果卷积核不变的话&#xff08;一直是5*5的卷积核&#xff09;&#xff0c;那么我的网络最多也就只能弄到第七层了&#xff0c;如果我想搭建更…

恒太照明在北交所上市:募资规模缩水三成,第三季度收入下滑

11月17日&#xff0c;江苏恒太照明股份有限公司&#xff08;下称“恒太照明”&#xff0c;NQ:873339&#xff09;在北京证券交易所&#xff08;即“北交所”&#xff09;上市。本次上市&#xff0c;恒太照明的发行价格为6.28元/股&#xff0c;发行数量为2220万股&#xff0c;募…

Linux|centos7下部署安装alertmanager并实现邮箱和微信告警

前言&#xff1a; 一个成熟的符合一般人预想的资源监控平台应该是能够多维度的展示各种各样的数据&#xff0c;比如&#xff0c;服务器的内存使用率&#xff0c;磁盘io状态&#xff0c;磁盘使用率&#xff0c;CPU的负载状态&#xff0c;某个服务的状态&#xff08;比如&#x…

Pandas数据分析33——数据多条件筛选(点估计和区间估计评价指标)

本次是写论文代码区间估计评价指标有感..... 数据框有两列的时候&#xff0c;我们想筛选A列大于B列的样本出来时&#xff0c;只需要用布尔值索引就行&#xff1a; df[df[A]>df[B]] 可是多条件的筛选的时候怎么办&#xff0c;比如我需要A大于B列&#xff0c;还有A小于C列。…

软件测试“摆烂”已经成为常态化,我们应该怎样冲出重围?

网络日新月异发展的今天&#xff0c;每隔一段时间就会出现一些新的网络热词&#xff0c;最近“摆烂”成功突出重围&#xff0c;成为大家热议的中心。什么是“摆烂”&#xff1f;“摆烂”就是事情无法向好发展的时候直接选择妥协&#xff0c;不采取任何措施加以改变&#xff0c;…

兼容 信创鲲鹏/M1 arm64架构的kafka镜像

当前热度比较高的kafka镜像是wurstmeister/kafka&#xff0c;在dockerhub上有很多的使用次数。我起初很开心最新版支持arm64架构&#xff0c;然后拉到本地用Mac M1跑也很完美 但是&#xff01;我放到信创鲲鹏的生产环境&#xff0c;导入镜像没问题&#xff0c;但一用docker-com…

IPWorks Zip Delphi 流式压缩组件

IPWorks Zip Delphi 流式压缩组件 IPWorks Zip允许开发人员使用Zip、Tar、Gzip、7-Zip、Bzip2、ZCompress或Jar压缩标准轻松地将压缩和解压缩集成到应用程序中。IPWorks Zip组件是从头开始构建的&#xff0c;将卓越的速度与出色的数据压缩比相结合。 IPWorks Zip功能 文件压…

Allegro如何给铜皮导弧操作详解

Allegro如何给铜皮导弧操作详解 当需要给如下铜皮导弧的,是一件比较麻烦的事情,但是可以用以下两个方法来实现 方法一 具体操作如下 shape-decompose shape Find选择shapes Options选择层面,比如top层,选择delete shape after decompose 框选铜皮 得到下图效果,然后…

SNMP 协议解析(一)

♥️作者&#xff1a;小刘在C站 ♥️每天分享课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放。 一.SNMP是什么 是基于TCP/IP协议族的网络管理标准&#xff0c;它的前身是简单网关监控协议(SGMP)&#xf…

HOST前后端分离小操作

“本地测试项目配置域名小操作” ​ 相关文章【欢迎关注该公众号“一路向东”】&#xff08;CORS处理跨域问题&#xff09;&#xff1a; CORS跨域问题配置白名单CORS_ORIGIN_WHITELIST HOSTS 本地测试域名必然少不了修改&#xff1a;C:/Windows/System32/driver/etc/host文件&…

MVVM的构建(javakotlin)

概念性的描述就不写了&#xff0c;直接上代码 MVVM框架&#xff0c;主要是构建基类&#xff0c;实现ViewModel绑定&#xff0c;ViewBinding的绑定&#xff0c;在构建好基类后&#xff0c;后续开发中新建activity或fragment的viewModel和viewBinding就会在基类的方法中实现绑定…

Python virtualenv工具设置虚拟环境和VS code调试Python

Python virtualenv工具设置虚拟环境和VS code调试Python1. Window环境下采用VS code调试Python和虚拟环境1.1 安装Python1.2 安装虚拟环境工具virtualenv1.3 Windows上使用虚拟环境的基本操作1.4 Windows上VS code使用虚拟环境2. Linux环境下采用VS code调试Python和虚拟环境2.…

SAP 一次性读取工单的所有状态(工单抬头、工序、子工序、检验特性等等)

1. 前言 支持读取状态列表 2. 实现 代码 DATA: ls_objects TYPE tca11,ls_t490_imp TYPE t490. DATA: lt_ord_pre_imp TYPE TABLE OF ord_pre. FIELD-SYMBOLS: <fs_jest> TYPE any.DATA: lt_jest TYPE TABLE OF jest."fill var ls_objects VALUE #( flg_alt X…