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

news2024/12/27 7:10:12

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.coloradmin.cn/o/2253784.html

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

相关文章

【开源免费】基于Vue和SpringBoot的洗衣店订单管理系统(附论文)

博主说明:本文项目编号 T 068 ,文末自助获取源码 \color{red}{T068,文末自助获取源码} T068,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

CAN接口设计

CAN总线的拓扑结构 CAN总线的拓扑结构有点像485总线,都是差分的传输方式,总线上都可以支持多个设备,端接匹配电阻都是120Ω。 485和CAN通信方面最大的区别:网络特性。485是一主多从的通讯方式,CAN是多主通讯,多个设备都可以做主机。那多个设备都相要控制总线呢?…

Keil5配色方案修改为类似VSCode配色

1. 为什么修改Keil5配色方案 视觉习惯:如果你已经习惯了VSCode的配色方案,尤其是在使用ESP-IDF开发ESP32时,Keil5的默认配色可能会让你感到不习惯。减少视觉疲劳:Keil5的默认背景可能过于明亮,长时间使用可能会导致视…

C++设计模式之外观模式

动机 下图中左边方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统…

矩阵转置        ‌‍‎‏

矩阵转置 C语言代码C 语言代码Java语言代码Python语言代码 💐The Begin💐点点关注,收藏不迷路💐 输入一个n行m列的矩阵A,输出它的转置 A T A^T AT。 输入 第一行包含两个整数n和m,表示矩阵A的行数和列数。…

Linux输入设备应用编程

本章学习输入设备的应用编程,首先要知道什么是输入设备?输入设备其实就是能够产生输入事件的设备就称为输入设备,常见的输入设备包括鼠标、键盘、触摸屏、按钮等等,它们都能够产生输入事件,产生输入数据给计算机系统。…

STM32MX 配置CANFD收发通讯

一、环境 MCU:STM32G0B1CEU6 CAN收发器:JIA1042 二、MX配置 配置SYS 配置canfd并开启中断,我开了两个FDCAN,配置是一样的,这里贴一下波特率的计算公式: 也就是:CAN时钟频率/预分频器/&…

第100+32步 ChatGPT学习:时间序列EMD分解

基于Python 3.9版本演示 一、写在前面 之前我们介绍过时间序列的季节性分解。 最近又学到了好几种骚操作分解,且可以用这些分解优化时间序列预测性能。 首先,我们来学一学经验模态分解(Empirical Mode Decomposition,EMD&#…

Spring Shell如何与SpringBoot集成并快速创建命令行界面 (CLI) 应用程序

Spring Shell 介绍 Spring Shell 是一个强大的工具,可用于构建命令行应用程序,提供了简单的方式来创建和管理交互式 CLI。它适合那些希望通过命令行与 Java 应用程序进行交互的开发者,尤其是在需要自动化、交互式输入或与 Spring 生态系统集…

后端返回前端的数据量过大解决方案

后端返回前端的数据量过大解决方案 性能面板(Performance) chrome调试指南 原因 遇到一个页面有好几个表格,部分表格采用虚拟滚动条 数据量有点大 接近快60s了,看一下是哪里导致的慢 后台请求方法执行并不慢 2024-12-04 15:21:52.889 INFO 69948 …

linux 系列服务器 高并发下ulimit优化文档

系统输入 ulimit -a 结果如下 解除 Linux 系统的最大进程数 要解除或提高 Linux 系统的最大进程数,可以修改 ulimit 设置和 /etc/security/limits.conf 文件中的限制。 临时修改 ulimit 设置 可以使用 ulimit 命令来查看和修改当前会话的最大进程数: 查…

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序

高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数,把小于基准数的放到基准数的左边,把大于基准数的放到基准数的右边,采用 “ 分治算法 ”处理剩余元素,直到整个序列变为有序序列。 最好和平均的复杂度&#xff1a…

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接:P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度:普及 首先介绍下二叉树的遍历: 学过数据结构都知道二叉树有三种遍历: 1.前序遍历:根左右 2.中序遍历:左根…

# 全过程 快速创建一个Vue项目

如何快速创建一个Vue项目 前置知识 ​ 下载 Node.js 并且进行安装和配置 Node.js,因为 npm(Node Package Manager)是随 Node.js 一起安装的。 Node.js 下载地址 : Node.js 官方网站 ​ (如果你还没有关于 Node.js&webpack 的相关知识…

小程序 模版与配置

WXML模版语法 一、数据绑定 1、数据绑定的基本原则 (1)在data中定义数据 (2)在WXML中使用数据 2、在data中定义页面的数据 3、Mustache语法的格式(双大括号) 4、Mustache语法的应用场景 (…

智慧银行反欺诈大数据管控平台方案(四)

智慧银行反欺诈大数据管控平台的核心内容,是通过整合多维度、多层次的金融交易信息,利用先进的大数据分析、机器学习与人工智能算法,构建一个系统性、实时性和智能化的反欺诈管控网络,旨在提供全面、高效、精准的风险评估机制。该…

MSSQL2022的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序

MSSQL2022导入Excel的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序 一、导入情况二、问题发现三、问题解决 最近在安装新版SQLServer SSMS 2022后,每次导入Excel都会出现错误提示:未在本地计算机上注册“Microsoft.AC…

基于极角排序实现二维点的逆时针排列

在二维几何计算中,常常需要对一组点进行逆时针排序,以便用于构建多边形、实现凸包算法或绘制几何图形等。本文将详细介绍一种基于极角计算的方法,使用C++实现将点集按照逆时针顺序排列,并提供完整代码和输出示例,适合直接应用于工程项目或算法学习。 一、问题背景 在一个…

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount

目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多,Hbase移动到开头,后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表,并写入数据 create "wunaii…

学习threejs,使用canvas更新纹理

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Texture 贴图 二、&#x1…