ES系列--分析器

news2024/11/27 7:44:38

一、前言

ES进行文档分析就会涉及到分析器,无论是内置的分析器,还是自定义的分析器,都是由一个分词器(tokenizers) 、0或多个词项过滤器(token filters)、0或多个字符过滤器(character filters)组成。

二、内置分析器 

Elasticsearch 还附带了可以直接使用的预包装的分析器。以下会用

"Set the shape to semi-transparent by calling set_trans(5)" 这段字符串对内置的各种分析器进行区分。

 一、标准分析器

标准分析器是 Elasticsearch 默认使用的分析器。它是分析各种语言文本最常用的选择。 它根据 Unicode 联盟定义的单词边界划分文本,删除绝大部分标点。最后,将词条小写。 它会产生:

set, the, shape, to, semi, transparent, by, calling, set_trans, 5

二、简单分析器 

简单分析器在任何不是字母的地方分隔文本,将词条小写。它会产生:

set, the, shape, to, semi, transparent, by, calling, set, trans

三、空格分析器 

空格分析器在空格的地方划分文本。它会产生:

Set, the, shape, to, semi-transparent, by, calling, set_trans(5)

四、语言分析器

特定语言分析器可用于 很多语言。它们可以考虑指定语言的特点。例如, 英语 分析 器附带了一组英语无用词(常用单词,例如 and 或者 the ,它们对相关性没有多少影响), 它们会被删除。 由于理解英语语法的规则,这个分词器可以提取英语单词的 词干 。

英语 分词器会产生下面的词条:

set, shape, semi, transpar, call, set_tran, 5

注意看 transparent、 calling 和 set_trans 已经变为词根格式

三、IK分词器

一、IK分词器测试

        当Elasticsearch在你的文档中检测到一个新的字符串域,它会自动设置其为一个全文 字 符串 域,使用 标准 分析器对它进行分析。你不希望总是这样。可能你想使用一个不同的 分析器,适用于你的数据使用的语言。有时候你想要一个字符串域就是一个字符串域—不使用分析,直接索引你传入的精确值,例如用户 ID 或者一个内部的状态域或标签。要做到这 一点,我们必须手动指定这些域的映射。

很多时候我们使用默认的分析器,是无法达到我们的需求的。例如:

 GET http://localhost:9200/_analyze

{

"text":"测试单词"

}

如果使用内置的分析器,会产生:

{
    "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
        }
    ]
}

这是由于ES 的默认分词器无法识别中文中测试、单词这样的词汇,而是简单的将每个字拆完分为一 个词。这样的结果显然不符合我们的使用要求,所以我们需要下载 ES 对应版本的中文分词器。

IK 中文分词器地址:

https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0 将解压后的后的文件夹放入 ES 根目录下的 plugins 目录下,重启 ES 即可使用。

1、ik_max_word:会将文本做最细粒度的拆分

2、ik_smart:会将文本做最粗粒度的拆分

我们这次加入新的查询参数"analyzer":"ik_max_word"

GET http://localhost:9200/_analyze

{

"text":"测试单词",

"analyzer":"ik_max_word"

}

{
    "tokens": [{
            "token": "测试",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "单词",
            "start_offset": 2,
            "end_offset": 4,
            "type": "CN_WORD",
            "position": 1
        }
    ]
}

二、IK分词器拓展

ES 中也可以进行扩展词汇,首先查询

GET http://localhost:9200/_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": 3,
        "type": "CN_CHAR",
        "position": 2
    }, {
        "token": "卓",
        "start_offset": 3,
        "end_offset": 4,
        "type": "CN_CHAR",
        "position": 3
    }, {
        "token": "德",
        "start_offset": 4,
        "end_offset": 5,
        "type": "CN_CHAR",
        "position": 4
    }]
}

仅仅可以得到每个字的分词结果,我们需要做的就是使分词器识别到弗雷尔卓德也是一个词 语

首先进入 ES 根目录中的 plugins 文件夹下的 ik 文件夹,进入 config 目录,创建 custom.dic 文件,写入弗雷尔卓德。同时打开 IKAnalyzer.cfg.xml 文件,将新建的 custom.dic 配置其中, 重启 ES 服务器。

四、分析器使用场景 

当我们 索引 一个文档,它的全文域被分析成词条以用来创建倒排索引。 但是,当我 们在全文域 搜索 的时候,我们需要将查询字符串通过 相同的分析过程 ,以保证我们搜索 的词条格式与索引中的词条格式一致。

1、当你查询一个全文域时,会对查询字符串应用相同的分析器,以产生正确的搜 索词条列表。

2、当你查询一个 精确值 域时,不会分析查询字符串,而是搜索你指定的精确值。

五、测试分析器 

有些时候很难理解分词的过程和实际被存储到索引中的词条,特别是你刚接触 Elasticsearch。为了理解发生了什么,你可以使用 analyze API 来看文本是如何被分析的。 在消息体里,指定分析器和要分析的文本

GET http://localhost:9200/_analyze

{

        "analyzer": "standard",

        "text": "Text to analyze"

}

结果中每个元素代表一个单独的词条:

{
    "tokens": [{
        "token": "text",
        "start_offset": 0,
        "end_offset": 4,
        "type": "",
        "position": 1
    }, {
        "token": "to",
        "start_offset": 5,
        "end_offset": 7,
        "type": "",
        "position": 2
    }, {
        "token": "analyze",
        "start_offset": 8,
        "end_offset": 15,
        "type": "",
        "position": 3
    }]
}

token 是实际存储到索引中的词条。

position 指明词条在原始文本中出现的位置。

start_offset 和 end_offset 指明字符在原始字符串中的位置。

六、自定义分析器 

虽然 Elasticsearch 带有一些现成的分析器,然而在分析器上 Elasticsearch 真正的强大之 处在于,你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单 元过滤器来创建自定义的分析器。一个 分析器 就是在一个包 里面组合了三种函数的一个包装器, 三种函数按照顺序被执行:

1、字符过滤器:

字符过滤器 用来 整理 一个尚未被分词的字符串。例如,如果我们的文本是 HTML 格 式的,它会包含像

或者这样的 HTML 标签,这些标签是我们不想索引的。我 们可以使用 html 清除 字符过滤器 来移除掉所有的 HTML 标签,并且像把 Á 转换 为相对应的 Unicode 字符 Á 这样,转换 HTML 实体。一个分析器可能有 0 个或者多个字符 过滤器。

2、分词器:

一个分析器 必须 有一个唯一的分词器。 分词器把字符串分解成单个词条或者词汇单 元。 标准 分析器里使用的 标准 分词器 把一个字符串根据单词边界分解成单个词条,并 且移除掉大部分的标点符号,然而还有其他不同行为的分词器存在。 例如, 关键词 分词器 完整地输出 接收到的同样的字符串,并不做任何分词。 空格分词器只根据空格分割文本 。正则分词器 根据匹配正则表达式来分割文本 。

3、词单元过滤器:

经过分词,作为结果的 词单元流 会按照指定的顺序通过指定的词单元过滤器 。 词单元过滤器可以修改、添加或者移除词单元。我们已经提到过 lowercase 和 stop 词过滤 器 ,但是在 Elasticsearch 里面还有很多可供选择的词单元过滤器。词干过滤器 把单词 遏 制 为 词干。 ascii_folding 过滤器移除变音符,把一个像 "très" 这样的词转换为 "tres"。ngram 和 edge_ngram 词单元过滤器 可以产生 适合用于部分匹配或者自动补全的词单元。 

创建自定义的分析器 :

PUT http://localhost:9200/my_index

{
    "settings": {
        "analysis": {
            "char_filter": { // 字符串过滤器
                "&_to_and": {
                    "type": "mapping",
                    "mappings": ["&=> and "] // 将& 转换为 and
                }
            },
            "filter": {
                "my_stopwords": {
                    "type": "stop",
                    "stopwords": ["the", "a"]
                }
            },
            "analyzer": {
                "my_analyzer": {
                    "type": "custom",
                    "char_filter": ["html_strip", "&_to_and"],
                    "tokenizer": "standard",
                    "filter": ["lowercase", "my_stopwords"]
                }
            }
        }
    }
}

结果:

{
    "tokens": [{
            "token": "quick",
            "start_offset": 4,
            "end_offset": 9,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "and",
            "start_offset": 10,
            "end_offset": 11,
            "type": "<ALPHANUM>",
            "position": 2
        },
        {
            "token": "brown",
            "start_offset": 12,
            "end_offset": 17,
            "type": "<ALPHANUM>",
            "position": 3
        },
        {
            "token": "fox",
            "start_offset": 18,
            "end_offset": 21,
            "type": "<ALPHANUM>",
            "position": 4
        }
    ]
}

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

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

相关文章

随机数检测(四)

随机数检测&#xff08;四&#xff09;- 累加和检测、近似熵检测、线性复杂度检测、Maurer通用统计检测、离散傅里叶检测 3.12 累加和检测方法3.13 近似熵检测方法3.14 线性复杂度检测3.15 Maurer通用统计检测3.16 离散傅里叶检测方法 如果商用密码产品认证中遇到问题&#xff…

Python应用实例(二)数据可视化(四)

数据可视化&#xff08;四&#xff09;下载数据 1.CSV文件格式1.1 分析CSV文件头‘1.2 打印文件头及其位置1.3 提取并读取数据1.4 绘制温度图表1.5 在图表中添加日期 从网上下载数据&#xff0c;并对其进行可视化。网上的数据多得令人难以置信&#xff0c;大多未经仔细检查。如…

智能车打开usb相机和激光雷达录制数据包的过程记录

首先&#xff0c;智能车的遥控器启动之后&#xff0c;要解除驻车挡位&#xff08;尾灯不亮红色才可以&#xff09;&#xff0c;然后右上角的那个拨杆是喇叭&#xff0c;对应的左上角的那个拨杆是控制挡位的&#xff0c;包括前进档&#xff0c;后退档。假如是前进&#xff0c;往…

【我们一起60天准备考研算法面试(大全)-第十五天 15/60】【摩尔投票法】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

CSAPP Lab入门探索

此为记录 虚拟机准备工作 下载VMware 直接在浏览器中搜索VMware Workstation即可 等待 安装就是直接下一步下一步即可&#xff0c;那个安装路径也改下&#xff0c;默认是装在系统盘中 许可证: 直接在百度中搜索VMware Workstation 17 Pro密钥大全即可 这里给出一个参考的&…

人体姿态估计动作识别调研报告

人体姿态估计&动作识别 视频演示 Refs: https://www.zhihu.com/zvideo/1227562268420235264 姿态估计与行为识别&#xff08;行为检测、行为分类&#xff09;的区别 Refs&#xff1a;姿态估计与行为识别&#xff08;行为检测、行为分类&#xff09;的区别 姿态估计 定…

两分钟倒计时 - 啊哈C语言 第4章第5节

题目要求&#xff1a; 尝试编写一个两分钟的倒计时&#xff0c;形如&#xff1a;2:00 1:59 1:58 … 1:00 0:59 0:58 … 0:02 0:01 0:00 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<windows.h> int main(){int a2,b0;while(a>0 &…

SpringMVC的XML配置解析-spring18

SpringMVC的有很多组件&#xff1a;&#xff08;这些我们都可以用配件进行配置&#xff09; 1、充沛器 2、映射器 3、视图解析器 默认情况下他们要使用哪个组件&#xff0c;我们可以挖一下&#xff1a; 第一个重叠器映射器 第二个 重叠器适配器 第三个 视图适配器 打开看…

Vue生命周期详解学习笔记

生命周期 生命周期又名生命周期回调函数&#xff0c;生命周期函数&#xff0c;生命周期钩子。生命周期是Vue在关键时刻帮我们调用的一些特殊名称的函数。生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求编写的。生命周期中的this指向vm或组件实例对象…

【PHP面试题48】Redis的事务?事务都有哪些注意的地方?

文章目录 一、关于事务1.1 事务的概念和优势1.2 Redis事务的基本用法 二、Redis事务的注意事项2.1 使用WATCH监视关键变量2.2 避免长时间事务2.3 避免事务中的循环2.4 处理事务执行结果2.5 考虑使用管道2.6 使用合适的事务隔离级别2.7 考虑事务的并发性2.8 监控事务执行情况 总…

项目管理进度管理神器:有效方法分享

在项目管理中&#xff0c;进度管理是至关重要的环节&#xff0c;它可以帮助项目团队及时发现和解决问题&#xff0c;确保项目按计划顺利进行。一个有效的进度管理方案需要考虑多方面的因素&#xff0c;包括任务分解、时间控制、资源分配、风险管理等。 如何有效的管理项目进度&…

剑指 Offer 68 - II. 二叉树的最近公共祖先

题目介绍 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

FL Studio2023最新中文版混音编曲宿主软件及电脑配置要求

现在大部分音乐的制作过程都是在宿主软件中完成的&#xff0c;宿主软件又称数字音频工作站&#xff0c;简写为DAW软件。目前市面上有非常多的宿主软件供大家选择&#xff0c;例如Cubase、Logic Pro以及我一直使用的FL Studio。每款不同的宿主软件都有不同的优缺点&#xff0c;所…

MFC第十七天 CFont类与LOGFONT结构体、记事本文件打开和保存及是否保存的逻辑流程分析、PreTranslateMessage虚函数与快捷键

文章目录 CFont类与LOGFONT结构体CFontDialog字体信息结构体与HFONT句柄的关系 记事本文件拖入、打开和保存及是否保存的逻辑流程分析PreTranslateMessage虚函数与快捷键附录 CFont类与LOGFONT结构体 CFontDialog 构造函数介绍 public: //用于指定字体对话框的初始字体属性&…

C# Modbus通信从入门到精通(4)——Modbus RTU(0x02功能码)

1、02(0x02)读线圈输入 使用该功能码能从远程地址中读取1到2000个输入线圈的状态,每个线圈的状态只能是0或者1,读取的线圈数量由主站读取时指定。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+起始地址高位+起始地址低位+线圈数量高位+线圈数量低位+CRC,一共8个…

Linux进程理解【程序地址空间】

Linux进程理解【程序地址空间】 文章目录 Linux进程理解【程序地址空间】1. 话题引入2. 进程地址空间2.1 虚拟地址2.2 写时拷贝 3. 知识扩展 我们先来看看C/C程序地址空间的分布图 如此多区域的划分是为了更好的使用和管理空间&#xff0c;但是真实的内存空间也是按照图上的地址…

nginx的下载与安装

https://nginx.org/en/download.html 下载地址&#xff08;我下载的是1.20.2&#xff09; 1、首先保证可以连接外网 2、将包拖入opt/nginx 3、安装gcc环境 &#xff08;如果出现问题可以参考https://www.cnblogs.com/lzxianren/p/4254059.html&#xff09; yum -y install gc…

你还在手动对比代码差异?这些高质量工具太香了

B站|公众号&#xff1a;啥都会一点的研究生 我发现相当一部分初学者&#xff08;甚至搬砖多年的老同志&#xff09;在对比文件差异的时候居然还是 观察法 文本内容少还凑活能用&#xff0c;成百上千行的时候把眼睛累坏了不说&#xff0c;关键还容易漏信息 接触的人与事多了会…

volatile的可见性探讨

我跟volatile修饰对象和数组能保证其内部元素的可见性&#xff1f;一文的作者有类似的疑惑&#xff0c;按语义&#xff0c;volatile修饰数组时&#xff0c;只是保证其引用地址的可见性&#xff0c;可为什么给数组加了volatile之后&#xff0c;似乎单个数组元素也有了可见性&…

Android Glide同步阻塞方式submit获得Bitmap,kotlin

droid Glide同步阻塞方式submit获得Bitmap&#xff0c;kotlin 需要放入后台线程&#xff0c;不能在主线程。 Android Glide预加载preload ,kotlin_zhangphil的博客-CSDN博客【代码】Android Paging 3,kotlin&#xff08;1&#xff09;在实际的开发中&#xff0c;虽然Glide解决了…