ElasticSearch08-分析器详解
零、文章目录
ElasticSearch08-分析器详解
1、分析器原理
- Elasticsearch的分词器(Analyzer)是全文搜索的核心组件,它负责将文本转换为一系列单词(term/token)的过程,也叫分词。
(1)分析器的构成
- 字符过滤器(Character Filters):
- 接收原始文本字符流,可以通过添加、移除或改变字符来转变原始字符流。例如,可以将印度-阿拉伯数字转换为阿拉伯-拉丁数字,或从流中去除HTML元素等。
- 分词器(Tokenizer):
- 接收字符流,将其分解为单独的tokens(通常是单个单词),并输出tokens流。例如,
whitespace分词器在看到任何空格时将文本分解为tokens。它会将文本"Quick brown fox!"转换为多个terms[Quick, brown, fox!]。分词器还负责记录每个term的顺序或位置以及该term所代表的原始单词的开始和结束字符偏移量。
- 接收字符流,将其分解为单独的tokens(通常是单个单词),并输出tokens流。例如,
- Token过滤器(Token Filters):
- 接收令牌流,并且可以添加、删除或改变token。例如,
lowercasetoken过滤器将所有token转换为小写,stoptoken过滤器从token流中删除常用词(停用词),而synonymtoken过滤器将同义词引入token流中。Token过滤器不允许更改每个token的位置或字符偏移量。
- 接收令牌流,并且可以添加、删除或改变token。例如,
(2)分析器的工作流程
- 字符过滤器处理:文本首先通过字符过滤器,进行预处理,如去除HTML标签或格式转换。
- 分词器分词:经过预处理的文本进入分词器,分词器根据定义的规则(如空格、标点符号等)将文本拆分成单个词汇。
- Token过滤器处理:分词后的词汇通过一系列的Token过滤器,进行进一步的处理,如小写化、停用词过滤、同义词扩展等。
- 输出tokens:经过Token过滤器处理后的词汇成为最终的tokens,这些tokens将被用于构建倒排索引。
(3)分析器的重要性
- 分词器对于Elasticsearch的全文搜索至关重要,因为它直接影响到搜索的准确性和相关性。不同的语言和文本类型可能需要不同的分词器来最有效地处理文本。
- Elasticsearch提供了多种内置分词器,如
standard、simple、whitespace、stop等,以适应不同的应用场景。 - 用户也可以根据需要自定义分词器,以满足特定的分词需求。
2、常见内置分词器
| 分词器名称 | 描述 | 示例文本 | 分词结果示例 |
|---|---|---|---|
| Standard Tokenizer | 使用Unicode文本分割算法,去除标点符号,适用于大多数欧洲语言 | “Elasticsearch: Search & Analytics” | [“Elasticsearch”, “Search”, “Analytics”] |
| Whitespace Tokenizer | 以空白字符为分词符,包括空格和制表符 | “Elasticsearch, search & analytics” | [“Elasticsearch,”, “search”, “&”, “analytics”] |
| Lowercase Tokenizer | 类似Whitespace Tokenizer,但将所有tokens转换为小写 | “Elasticsearch, search & analytics” | [“elasticsearch,”, “search”, “&”, “analytics”] |
| Keyword Tokenizer | 不进行分词,将整个文本作为一个单独的token | “Elasticsearch: Search & Analytics” | [“Elasticsearch: Search & Analytics”] |
| Pattern Tokenizer | 使用正则表达式进行分词,默认为\W+(非单词字符) | “Elasticsearch: Search & Analytics” | [“Elasticsearch”, “Search”, “Analytics”] |
| N-Gram Tokenizer | 创建n-grams,连续的字符序列 | “elasticsearch”(2-gram) | [“el”, “le”, “ea”, “ar”, “rc”, “ch”, “ha”, “an”, “nt”, “ts”] |
| Edge N-Gram Tokenizer | 从单词的开始或结束部分生成n-grams | “elasticsearch”(1-gram,edge) | [“e”, “l”, “s”, “e”, “l”, “a”, “r”, “c”, “h”] |
3、分词器使用场景
(1)索引阶段(Indexing Phase)
- **文档索引:**当文档被索引到Elasticsearch时,分词器用于将文本字段(如标题、内容等)转换为一系列tokens(词项)。这些tokens被存储在倒排索引中,以便后续搜索。
- **分析器应用:**在索引过程中,指定的分析器(由分词器和token过滤器组成)会被应用到字段上,以确定如何将文本分割成tokens。
(2)查询阶段(Query Phase)
- **查询解析:**当执行搜索查询时,Elasticsearch会对查询文本应用与索引时相同的分析器,包括分词器。这意味着查询文本也会被转换成tokens。
- **查询处理:**查询的tokens与索引的倒排索引中的tokens进行匹配,以确定哪些文档包含这些tokens。
(3)相关性评分(Scoring Phase)
- **评分计算:**在查询过程中,Elasticsearch会根据tokens在文档中出现的次数和频率计算相关性评分。分词器的使用确保了查询tokens与索引tokens的一致性,从而使得评分准确。
(4)聚合(Aggregations)
- **术语聚合:**在执行基于术语的聚合(如terms聚合)时,分词器确保了聚合字段的tokens与查询tokens的一致性。
(5)高亮(Highlighting)
- **结果高亮:**在搜索结果中,Elasticsearch会使用与索引相同的分析器对查询文本进行分词,以便在文档中高亮显示匹配的tokens。
(6)建议(Suggestions)
- **自动完成和建议:**在自动完成或建议功能中,分词器用于处理用户输入的查询,以便与索引中的tokens匹配。
(7)同义词处理(Synonyms)
- **查询扩展:**在使用同义词时,分词器可以与同义词过滤器结合使用,以便在查询时扩展tokens,包括同义词。
4、使用分词器
(1)默认分词器
- Elasticsearch的默认分词器是
standard分词器。这个分词器适用于大多数西方语言,特别是英文,它基于Unicode文本分割算法(Unicode Text Segmentation)来分割文本,并去除大多数标点符号。standard分词器在处理文本时会将所有单词转换为小写,以便进行不区分大小写的匹配。 - 在创建新的索引时,如果不指定分词器,Elasticsearch会自动使用
standard分词器来处理文本字段。例如,如果你创建了一个名为my_index的索引,并且没有指定分析器,那么my_index中的text字段将默认使用standard分词器。 - 使用分词器进行分词,默认分词器无法解析中文词组,所以全部分词成单个字。
# 请求
Get _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},{"token" : "器","start_offset" : 4,"end_offset" : 5,"type" : "<IDEOGRAPHIC>","position" : 4}]
}
- 中文分词指定中文 ik 分词器
# 请求
Get _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" : 5,"type" : "CN_WORD","position" : 1},{"token" : "分词","start_offset" : 2,"end_offset" : 4,"type" : "CN_WORD","position" : 2},{"token" : "器","start_offset" : 4,"end_offset" : 5,"type" : "CN_CHAR","position" : 3}]
}
(2)创建索引并指定分析器
- 我们创建了一个名为
my_custom_analyzer的自定义分析器,它使用standard分词器,并且应用了lowercase和asciifolding过滤器。 - 我们将
text字段的分析器设置为定义的my_custom_analyzer。
# 请求
PUT /my_index
{"settings": {"analysis": {"analyzer": {"my_custom_analyzer": {"type": "custom","tokenizer": "standard","filter": ["lowercase", "asciifolding"]}}}},"mappings": {"properties": {"text": {"type": "text","analyzer": "my_custom_analyzer"}}}
}# 返回
{"acknowledged" : true,"shards_acknowledged" : true,"index" : "my_index"
}
(3)索引文档
text字段的值会被my_custom_analyzer处理,包括分词、小写化和ASCII折叠。
# 请求
POST /my_index/_doc
{"text": "Elasticsearch is a distributed search engine."
}# 返回
{"_index" : "my_index","_type" : "_doc","_id" : "mhUp05MBwu_sOZK4ykdt","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 0,"_primary_term" : 1
}
(4)执行搜索
- 在这个搜索查询中,我们指定了
my_custom_analyzer来处理查询字符串"Elasticsearch",确保查询时的分词和索引时的分词一致。
# 请求
GET /my_index/_search
{"query": {"match": {"text": {"query": "Elasticsearch","analyzer": "my_custom_analyzer"}}}
}# 返回
{"took" : 4,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 0.2876821,"hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "mhUp05MBwu_sOZK4ykdt","_score" : 0.2876821,"_source" : {"text" : "Elasticsearch is a distributed search engine."}}]}
}
(5)注意事项
- 分析器的选择对搜索结果有重要影响。正确的分析器可以帮助提高搜索的相关性和准确性。
- 自定义分析器可以根据具体需求组合不同的分词器和过滤器。
- 在创建索引后,分析器的设置不能更改,除非重新创建索引。
相关文章:
ElasticSearch08-分析器详解
零、文章目录 ElasticSearch08-分析器详解 1、分析器原理 Elasticsearch的分词器(Analyzer)是全文搜索的核心组件,它负责将文本转换为一系列单词(term/token)的过程,也叫分词。 (1ÿ…...
【IN、NOT、AND、OR】在 MySql 中的使用方法,使用场景、注意事项
目录 IN NOT AND OR 注意事项: 使用场景: IN 用于指定某个字段的值在一个预定义的列表中。 SELECT * FROM users WHERE age IN (20, 25, 30);查询返回 age 字段 是20、25 、30 的用户记录。 NOT 用于对条件进行否定。 查询将返回与指定 条件相…...
Face to face
1.西班牙添加5G volte 首先carrierconfig里使能 <boolean name"carrier_nr_available_bool" value"true" /> <boolean name"carrier_volte_available_bool" value"true" /> 其次 组件apn配置ims参数 2.印度j…...
宝塔配置python项目提示python版本与安装的不符
用宝塔的网站添加了项目,配置选择了python3.8,但是在终端并且进入了虚拟环境查看python的版本居然还是默认是2.7.5版本。 官方是举列说明,这张图是用python管理器生成的 而我用的 网站--python项目, 那么虚拟路径在 /www/serve…...
Restaurants WebAPI(一)—— clean architecture
文章目录 项目地址一、Restaurants.Domain 核心业务层1.1 Entities实体层1.2 Repositories 数据操作EF的接口二、Restaurants.Infrastructure 基础设施层2.1 Persistence 数据EF CORE配置2.2 Repositories 数据查询实现2.3 Extensions 服务注册三、Restaurants.Application用例…...
c++数据结构算法复习基础--13--基数算法
基数排序 - 桶排序 时间复杂度 O(n*d) – d为数据的长度 每次比较一位(个位、十位。。。),所以取值范围就为0-9。 根据该特点,设计桶的概念 – 0号桶、1号桶… 1、思想 1)找出最长的数字,确定要处理的…...
ntp设置
NTP(Network Time Protocol)简介 ntp授时定义 - NTP是一种用于在计算机网络中同步时间的协议。它确保网络中的各个设备(如服务器、客户端计算机、网络设备等)的时钟保持准确一致。 - 其工作原理是通过分层的时钟源体系ÿ…...
如何在Java中使用封装好的API接口?
1.选择合适的 HTTP 库 在 Java 中,可以使用多种库来进行 HTTP 请求。java.net.HttpURLConnection是 Java 标准库中的类,能够满足基本的 HTTP 请求需求,但使用起来相对复杂。另外,还有一些第三方库,如OkHttp和Apache H…...
AWS EKS 相关错误修复 - remote error: tls: internal error - CSR pending
现象 升级aws eks的kubernetes版本后执行kubectl logs 或者kubectl exec相关命令会出现报错 remote error: tls: internal error 执行kubectl get csr -A查看csr出现一直pending的状态,并且出现问题的pod都在新创建出来的eks node节点上 kubectl get csr -A NAME AGE …...
浏览器事件循环机制
JavaScript 是单线程运行的语言,同一时间只能执行一个任务。单线程意味着: 如果某个任务执行时间过长,后续任务会被阻塞。 同步任务和异步任务的调度需要一种机制来管理。 为了解决这个问题,事件循环应运而生,它可以…...
ubuntu22.04编译安装Opencv4.8.0+Opencv-contrib4.8.0教程
本章教程,主要记录在Ubuntu22.04版本系统上编译安装安装Opencv4.8.0+Opencv-contrib4.8.0的具体过程。 一、下载opencv和opencv-contrib包 wget https://github.com/opencv/opencv/archive/refs/tags/4.8.0.zip wget https://github.com/opencv/opencv_contrib/archive/refs/…...
概率论得学习和整理27:关于离散的数组 随机变量数组的均值,方差的求法3种公式,思考和细节。
目录 1 例子1:最典型的,最简单的数组的均值,方差的求法 2 例子1的问题:例子1只是1个特例,而不是普遍情况。 2.1 例子1各种默认假设,导致了求均值和方差的特殊性,特别简单。 2.2 我觉得 加权…...
【排序算法】——插入排序
目录 前言 简介 基本思想 1.直接插入排序 2.希尔排序 代码实现 1.直接插入排序 2.希尔排序 总结 1.时空复杂度 2.稳定性 尾声 前言 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列&…...
MySQL的并发控制与MVCC机制深度解析
目录 1. MySQL中的并发问题2. 数据库的隔离级别3. MVCC(多版本并发控制)机制3.1 MVCC的实现原理3.2 Read View详解3.3 当前读与快照读 4. MVCC在不同隔离级别下的工作方式5. MVCC解决幻读问题6. MVCC的优缺点优点:缺点: 7. MVCC在…...
Qt编译MySQL数据库驱动
目录 Qt编译MySQL数据库驱动 测试程序 Qt编译MySQL数据库驱动 (1)先找到MySQL安装路径以及Qt安装路径 C:\Program Files\MySQL\MySQL Server 8.0 D:\qt\5.12.12 (2)在D:\qt\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql下…...
uniapp地址类 方法
关于点击没反应 manifest.json 检查是否添加了对应的权限 /* 小程序特有相关 */"mp-weixin" : {"appid" : "wxc481f10754f1d9df","setting" : {"urlCheck" : false,"es6" : true,"postcss" : true,&qu…...
使用Idea自带的git功能进行分支合并
文章目录 1.背景描述2.分支切换3.分支合并的具体操作4.将在local环境下,从dev合并到qas分支上的代码,推送到远端 1.背景描述 目前在开发的当前项目有四个分支,master(主分支)、pre(预生产分支)、qas(测试分支)、dev(开发分支); …...
酷盾安全:Edge SCDN边缘安全内容分发网络
在当今数字化迅猛发展的时代,互联网内容分发的高效与安全成为了企业不可忽视的重要课题。为了满足这一需求,酷盾安全推出了创新的Edge Secure Content Delivery Network(Edge Scdn)解决方案,它不仅融合了分布式DDoS防护…...
H5 中 van-popup 的使用以及题目的切换
H5 中 van-popup 的使用以及题目的切换 在移动端开发中,弹窗组件是一个常见的需求。vant 是一个轻量、可靠的移动端 Vue 组件库,其中的 van-popup 组件可以方便地实现弹窗效果。本文将介绍如何使用 van-popup 实现题目详情的弹窗展示,并实现…...
Liinux下VMware Workstation Pro的安装,建议安装最新版本17.61
建议安装最新版本17.61,否则可能有兼容性问题 下载VMware Workstation安装软件 从官网网站下载 https://support.broadcom.com/group/ecx/productdownloads?subfamilyVMwareWorkstationPro 选择所需版本 现在最新版本是17.61,否则可能有兼容性问题…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
