【ElasticSearch】倒排索引与ik分词器

ElasticSearch,简称ES(后文将直接使用这一简称),是一款卓越的开源分布式搜索引擎。其独特之处在于其近乎实时的数据检索能力,为用户提供了迅速、高效的信息查询体验。

它能够解决全文检索,模糊查询、数据分析等问题。那么它的搜索原理是什么呢?

1. 正排索引

正排索引(Forward Index)是一种索引机制,它按照文档的顺序来组织数据,通常是按照文档ID或者其他唯一的标识符进行排序。在正排索引中,索引的键是文档的标识符,而索引的值则是文档的详细信息。

当你知道一个文档的ID时,可以通过正排索引迅速找到该文档的全部信息。

主键ID

数据

1

蔡徐坤偶像练习生

2

蔡徐坤喜欢篮球

3

蔡徐坤喜欢rap

4

蔡徐坤喜欢唱歌

表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档.

假设使用正向索引,那么当你搜索 ‘rap’ 的时候,搜索引擎必须检索文档中的每一个关键词,假设一个文档中包含成千上百个关键词,可想而知,会造成大量的资源浪费。于是倒排索引应运而生。

2. 倒排索引

倒排索引,也被称为反向索引或逆向索引,是一种索引数据的方法。与正排索引不同。倒排索引是按照文档中的词汇(关键词)来组织。也就是说在倒排索引中,索引的键是文档集合中出现过的每个独特词汇或关键词,索引的值是包含该关键词的所有文档的标识符(如文档ID),以及可选的额外信息。

索引关键字

对应数据序号(主键id)

偶像练习生

1

喜欢

2、3、4

蔡徐坤

1、2、3、4

rap

3

唱歌

4

篮球

2

2.1. 倒排索引的组成

ES 倒排索引包含两个部分:单词词典和倒排列表

2.1.1. 单词词典

词典是倒排索引的核心部分,它存储了文档集合中的所有词项(Term)。
词典的主要作用是:

  • 提供查询入口,指向与该词项相关的文档列表。
  • 支持词项的快速查找,例如通过哈希表或 B+ 树。

2.1.2. 倒排列表

倒排列表是倒排索引的主体部分,每个词项对应一个倒排列表,记录了该词项出现在的文档及位置信息 。

倒排列表的组成

  1. 文档ID(Doc ID)
  • 表示词项所在的文档。
  • 通常按照升序存储,便于快速合并查询。
  1. 词频(Term Frequency, TF)
  • 表示词项在文档中出现的次数。
  • 用于相关性计算,例如 BM25 算法中用来衡量词项的重要性。
  1. 位置列表(Position List)
  • 记录 词项在文档中的位置(偏移量)。
  • 支持短语查询、邻近查询等复杂搜索功能。

3. 分词器

根据前面学习的倒排索引的概念。倒排索引是按照文档中的词汇(关键词)来组织的,索引的键是文档集合中出现过的每个独特词汇或关键词。那es是怎么将这些关键词提取出来的呢?这其实就是es中的分词器在起着作用,它负责将文本切分成一个个有意义的词语,以建立索引或进行搜索和分析。

我们的业务中通常使用的是中文分词,es的中文分词默认会将中文词每个字看成一个词比如:“我想在周五去看电影”会被分为”我”,”想””在”,”周”,”五””,”去”,“看”,“电”,“影”。这显然是不太符合用户的使用习惯,所以我们需要安装中文分词器ik,来讲中文内容分解成更加符合用户使用的关键学。

GET _analyze
{"text":"我想在周五去看电影"
}

3.1. ik分词器

IK分词器是一个轻量级的中文分词工具,广泛应用于搜索引擎(如Elasticsearch)等领域。IK分词器提供两种分词模式:细粒度模式和智能模式,具有较高的准确性和性能。

  • 细粒度模式:每个词都尽可能细化,即按字拆分。
  • 智能模式:根据语义进行分词,尽可能合并成合理的词汇。

3.2. ik分词器安装

步骤一:下载

Releases · infinilabs/analysis-ik · GitHub

我学习过程中安装的ES是8.5.3,理应需要下载和ES版本对应的ik分词器,但是官网中,并未给出8.5.3的版本。这里只能下载8.5.2的版本,但是也是可以使用的,后面配置的时候,修改一下配置文件即可。

步骤2:挂载

下载完成后将其压随后放置在:es容器内/usr/share/elasticsearch/plugins目录下,也可以通过配置

挂载目录的方式将插件放在挂载目录下

将整个“elasticsearch-analysis-ik-8.5.2”文件夹都放在启动es时候指定的挂载目录下。

docker run -d --name oj-es-dev -e "ES_JAVA_OPTS=-Xms256m -Xmx256m" -e "discovery.type=single-node" -v D:\javacode\oj-byte\deploy\dev\elasticSearch\es-plugins:/usr/share/elasticsearch/plugins -e "xpack.security.enabled=false" --privileged --network oj-network -p 9200:9200 -p 9300:9300 elasticsearch:8.5.3

这是我的启动命令,因此我就放在我的本地的 D:\javacode\oj-byte\deploy\dev\elasticSearch\es-plugins 文件下面。

步骤3:修改版本号

还需要将plugin-descriptor.properties里面的版本号进行修改。

然后重启ES的docker容器,进入kibana-dev,确认分词器是否安装成功。

GET _cat/plugins

3.3. 分词模式效果演示

ik分词器提供了两种分词模式:ik_smart 和ik_max_word,其中 ik_smart 模式会尽量保持长词,尽可能地保留词语的完整性,提高搜索的准确性,而ik_max_word 模式则会尽可能多地切分出词汇。即,

  • 细粒度模式(ik_max_word):每个词都尽可能细化,即按字拆分。
  • 智能模式(ik_smart ):根据语义进行分词,尽可能合并成合理的词汇。

ik_max_word

此时的划分,会比较细粒度,每个词都尽可能细化。

ik_smart

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

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

相关文章

uni-app写的微信小程序如何实现账号密码登录后获取token,并且每天的第一次登录后都会直接获取参数而不是耀重新登录(1)

uni-app写的微信小程序如何实现账号密码登录后获取token(而token的有效器一般是30分钟,当页面在操作时token是不会过去,,离开页面第二天登录时token就是过期状态,因为记住了账号密码就不会操作再次登录,但是…

SpringCloud框架学习(第七部分:分布式事务Seata)

目录 十五、SpringCloud Alibaba Seata处理分布式事务 1.分布式事务背景 2.Seata简介 (1)介绍 (2)工作流程 (3)各事务模式 (4)下载安装 3.Seata案例实战-数据库和表准备 …

apache中的Worker 和 Prefork 之间的区别是什么?

文章目录 内存使用稳定性兼容性适用场景 Apache中的Worker和Prefork两种工作模式在内存使用、稳定性以及兼容性等方面存在区别 内存使用 Worker:由于使用线程,内存占用较少。Prefork:每个进程独立运行,内存消耗较大。 稳定性 W…

[C#] 对24位图像进行水平翻转(FlipX)的跨平台SIMD硬件加速向量算法(使用YShuffleX3Kernel)

文章目录 一、标量算法1.1 算法实现1.2 基准测试代码 二、向量算法2.1 算法思路2.1.1 难点说明2.1.2 解决办法:每次处理3个向量2.1.3 用YShuffleX3Kernel对3个向量内的24位像素进行翻转 2.2 算法实现2.3 基准测试代码2.4 使用 YShuffleX3Kernel_Args 来做进一步的优…

python打包深度学习虚拟环境

今天师兄让我把环境打包发给他,我才知道可以直接打包深度学习虚拟环境,这样另一个人就不用辛辛苦苦的去装环境了,我们都知道有些论文他需要的环境很难装上。比如装Apex,装 DCN,mmcv-full 我现在把3090机子上的ppft虚拟…

基于MobileNet深度学习网络的MQAM调制类型识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频&#xff09…

Ceph分布式存储集群搭建

一.Ceph分布式存储 (1)Ceph概念:Ceph是一种高性能、可扩展的分布式存储系统,它提供了对象存储、块存储和文件系统存储三种存储接口,Ceph的设计目标是提供无单点故障的、高性能的、可扩展的存储解决方案,同时能够降低存储成本。(2)常用分布式存储方案Lust…

docker及docker exec命令学习笔记

docker exec 是一个常用的 Docker 命令,允许你在已经运行的容器中执行命令或启动新的进程。以下是详细介绍和常见用法: 基本语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG...]参数详解 1. CONTAINER指定目标容器的名字或容器 ID。可以通过以下命…

<工具 Claude Desktop> 配置 MCP server 连接本地 SQLite, 本机文件夹(目录) 网络驱动器 Windows 11 系统

也是在学习中... 起因: 抖音博客 艾克AI分享 他的视频 #143《Claude开源MCP彻底打破AI的信息孤岛》 提到: Claude开源的MCP太强了,视频后面是快速演示,反正看了好几遍也没弄明白。菜单都不一样,感觉用的不是同一家 Claude. 探…

(78)MPSK基带调制通信系统瑞利平坦衰落信道传输性能的MATLAB仿真

文章目录 前言一、MATLAB仿真1.仿真代码2.仿真结果 二、子函数与完整代码总结 前言 本文给出瑞利平坦衰落信道上的M-PSK通信系统性能仿真的MATLAB源代码与仿真结果。其中,调制方式M-PSK包括BPSK、QPSK、8-PSK、16-PSK、32-PSK等方式。 一、MATLAB仿真 1.仿真代码 …

go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源

go Pool Pool用于展示如何使用有缓冲的通道实现资源池,来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况(如共享数据库连接或者内存缓冲区)下非 常有用。如果goroutine需要从池里得到这些资…

LeetCode70. 爬楼梯(2024冬季每日一题 24)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#xf…

Android 系统之Init进程分析

1、Init进程流程 2、Init细节逻辑 2.1 Init触发shutdown init进程触发系统重启是一个很合理的逻辑,为什么合理? init进程是android世界的一切基石,如果android世界的某些服务或者进程出现异常,那么会导致整个系统无法正常使用…

用micropython 操作stm32f4单片机的定时器实现蜂鸣器驱动

import pyb import time # 初始化引脚和定时器通道作为PWM输出 # 注意:这里我们假设您使用的是支持PWM的引脚和定时器 # 在不同的MicroPython板上,支持的引脚和定时器可能不同 # 请查阅您的板的文档以确认正确的引脚和定时器 buzzer_pin pyb.Pin(PD15,…

长沙市的科技查新单位

1、中南大学图书馆科技查新站: 中南大学图书馆科技查新站成立于2003年12月,中南大学图书馆科技查新站作为教育部首批批准的科技查新工作站之一,具备了在全国范围内开展科技查新工作的专业资质。 2、湖南大学科技查新站: 湖南大学…

java基础语法光速入门

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理Java的基础语法部分 适合有编程基础的人快点掌握语法使用 没学过一两门语言的话。。还是不建议看了 极致的浓缩没有一点解释 注释 单行注释 // 多行注释 /**/ 数据类型 布尔型:true false 整型:int,lon…

【redis】集群详解

redis集群 一、集群的概念二、数据分片算法2.1哈希求余算法2.2一致性哈希算法2.3哈希槽分区算法 三、集群的搭建3.1配置docker-compose.yml文件3.2配置generate.sh脚本文件3.3构建redis集群3.4简单测试redis集群 四、故障处理流程4.1故障判定4.2故障转移 五、集群扩容 一、集群…

Linux | Linux的开机启动流程

对于linux系统的初学者来说,理解并掌握linux系统启动流程能够使你够深入的理解linux系统,还可以通过系统的启动过程来分析问题解决问题。 Linux开机启动的流程如下图 power on 开机 post自检(检查一部分大的硬件) BIOS&#xf…

Scala的模式匹配(5)

package hfd.test32 //匹配 变量的类型 object Test34_4 {def main(args: Array[String]): Unit {val i1val j:Double1.2val b:Booleanfalseval x:Anybx match {case _:Int>println(s"当前是Int")case _:Double>println(s"当前是Double")case a:Boo…

TiDB如何保证数据一致性

1. 分布式事务协议 TiDB 采用了类似 Google Percolator 的分布式事务协议来处理分布式事务。这个协议基于两阶段提交(2PC)的思想,但进行了优化和改进,以适应分布式环境的特殊需求。在 TiDB 中,当一个事务需要跨多个节…