Elasticsearch中倒排索引、分词器、DSL语法使用介绍

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

简介及安装请查看这篇:Elasticsearch简介及安装

文章目录

  • 一、 正向索引
  • 二、 倒排索引
  • 三、 正向索引和倒排索引的区别
  • 三、与Mysql的概念对比
  • 四、分词器(粗细力度拆分)
    • 4.1 原始分词器
    • 4.2 IK分词器
    • 4.3 安装IK分词器
      • 4.3.1 在线安装`较慢`
      • 4.3.2 离线安装ik插件`推荐`
    • 4.4 ik分词器测试
    • 4.5 IK分词器--拓展词库
  • 五、mapping属性介绍
  • 六、 索引库操作(类似表操作)
    • 6.1 创建索引库
    • 6.2 查询
    • 6.3 删除
    • 6.4 修改
  • 七、 文档操作(类似表中每条数据操作)
    • 7.1 添加
    • 7.2 查询
    • 7.3 删除
    • 7.4 修改

是

一、 正向索引

基于文档id创建索引,查询时先找文档,然后判断是否包含词条

正向索引(也称为“文档索引”或“内容索引”)是将文档ID与文档内容、单词相关联的关系。这意味着可以通过文档ID获取文档的内容。在构建索引时,它的结构相对简单,建立方便且易于维护。然而,在查询时需要对所有文档进行扫描,以确保没有遗漏,这会使得检索时间大大延长,检索效率低下。

数据库Mysql采用正向索引,例如:给表中的id建立索引,如下图所示
在这里插入图片描述

二、 倒排索引

对文档内容分词,对词条创建索引,并记录词条所在文档信息,查询时先根据词条查询文档id,然后获取文档

倒排索引是单词到文档ID的关联关系。也就是说,通过单词可以搜索到对应的文档ID。倒排索引是搜索引擎的核心,因为它们允许我们根据关键字快速找到相关的文档。倒排索引主要由两个部分组成:单词词典(Trem Dictionary)和倒排列表(Posting List)。单词词典记录了所有的文档分词后的结果,而倒排列表则记录了单词对应文档的集合。此外,倒排索引还包含位置(Position)和偏移(Offset)信息,用于词语搜索和高亮显示。

名词介绍:

  • 文档(document): 每条数据就是一个文档
  • 词条(term): 文档按照语义分成的词语

在这里插入图片描述

三、 正向索引和倒排索引的区别

正向索引:

  • 优点:

    • 可以给多个字段创建索引
    • 根据索引字段搜索,排序速度非常快
  • 缺点:

    • 根据非所以呢字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引

  • 优点:

    • 根据词条搜索,模糊搜索时速度非常快
  • 缺点:

    • 只能给词条创建索引,而不是字段
    • 无法根据字段做排序

三、与Mysql的概念对比

Mysql: 擅长事务类型操作,可以确保数据的安全性和一致性
Elasticsearch:擅长海量数据的搜索,分析,计算
在这里插入图片描述

四、分词器(粗细力度拆分)

4.1 原始分词器

Elasticsearch

  • 创建倒排索引时需要对文档分词;`
  • 在搜索时,需要对用户输入内容分词`
  • 但是默认的分词规则 对中文处理并不好。 (如下)
    我们希望按照词分
    在这里插入图片描述

4.2 IK分词器

处理中文分词,一般会使用IK分词器GitHub地址:https://github.com/medcl/elasticsearch-analysis-ik

在这里插入图片描述
ik_smart :最少切分,粗粒度
ik_max_word :最细切分,细粒度在这里插入图片描述

4.3 安装IK分词器

4.3.1 在线安装较慢

	# 进入容器内部docker exec -it es /bin/bash# 在线下载并安装./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip#退出exit#重启容器docker restart es# 查看es日志docker logs -f es

4.3.2 离线安装ik插件推荐

因为根据上篇Elasticsearch简介及安装中我们知道,我们的插件数据卷为:es-plugins

  1. 因此,通过下面命令查看:查看数据卷目录
    docker volume inspect es-plugins
    
  2. 目录被挂载到了:/var/lib/docker/volumes/es-plugins/_data 这个目录中。
  3. 将下载的ik分词器文件(GItHub地址中下载或者到我的主页中的资源进行下载)放到该目录下
  4. 重启容器
    # 重启容器
    docker restart es
    # 查看es日志
    docker logs -f es
    

4.4 ik分词器测试

ik_smart 分词器最少切分,粗粒度
在这里插入图片描述ik_max_word 分词器最细切分,细粒度
在这里插入图片描述

4.5 IK分词器–拓展词库

比如我想实现让上图中的text字段的空间文化分成一个词语

首先我们来看下ik分词器的词库如何配置

  1. 和上文中一样先查看ik分词器安装的位置

    docker volume inspect es-plugins
    
  2. 打开IK分词器config目录:
    在这里插入图片描述

  3. 只需要修改一个ik分词器目录中的config目录中的ilAnalyzer.cfg.xml文件即可
    在这里插入图片描述`

  4. 拓展词典和停止词典在当前配置文件的所在目录 在ext.dic文件中(没有新建即可),添加想要的拓展词语即可;

    停止词典同理一样
    在这里插入图片描述

    1. 最后重启es
    docker restart es# 查看 日志
    docker logs -f es
    
    1. 测试发现成功
      在这里插入图片描述

五、mapping属性介绍

Mapping(映射)是索引文档的约束,例如:字段数据类型约束,等等
文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/7.17/getting-started.html

在这里插入图片描述
在这里插入图片描述

六、 索引库操作(类似表操作)

6.1 创建索引库

上述有介绍其含义,例如:type为text可分词,keyword精确值也就是不可分词

put /student
{"mappings": {"properties": {"info": {"type": "text","analyzer": "ik_smart"},"email": {"type": "keyword","index": false},"name": {"properties": {"firstName": {"type": "keyword"},"lastName": {"type": "keyword"}}}}}
}

创建成功
在这里插入图片描述

6.2 查询

GET /索引库名
在这里插入图片描述

6.3 删除

DELETE /索引库名
在这里插入图片描述

6.4 修改

以后字段类型不可修改,只能新增字段
在这里插入图片描述再次查看成功添加
在这里插入图片描述

七、 文档操作(类似表中每条数据操作)

7.1 添加

post /student/_doc/1
{"info": "我爱学习","email": "asfdasfdd.@163.com","name": {"firstName": "关","lastName": "羽"}
}

在这里插入图片描述

7.2 查询

在这里插入图片描述

7.3 删除

在这里插入图片描述
发现删除成功了
在这里插入图片描述

7.4 修改

方式一:全量修改,会删除旧文档,添加新文档

那么存在为修改,不存在时为新增
在这里插入图片描述
在这里插入图片描述

方式二:增量修改,修改指定字段

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

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

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

相关文章

Go语言入门记录:从基础到变量、函数、控制语句、包引用、interface、panic、go协程、Channel、sync下的waitGroup和Once等

程序入口文件的包名必须是main,但主程序文件所在文件夹名称不必须是main,即我们下图hello_world.go在main中,所以感觉package main写顺理成章,但是如果我们把main目录名称改成随便的名字如filename也是可以运行的,所以…

Python采集关键词结果辅助写作

大家好!在进行学术研究和 写作时,获取准确、全面的文献资料和相关研究成果是非常重要的。在本文中,我将与你分享使用Python爬虫 采集 学术关键词结果来辅助 写作的方法,帮助你快速获取与研究主题相关的学术文献和 。 **1. 设置搜索…

SqlServer2019—解决SQL Server 无法连接127.0.0.1的问题

1、打开SQL Server 2019配置管理器 2、SQL Servere 网络配置(启用 Named Pipes 和 TCP/IP) 3、修改TCP/IP协议(右键选择属性—IP地址),具体如下图所示: 4、重启SQL Server服务

LLMs参数高效微调(PEFT) Parameter efficient fine-tuning (PEFT)

正如你在课程的第一周所看到的,训练LLMs需要大量的计算资源。完整的微调不仅需要内存来存储模型,还需要在训练过程中使用的各种其他参数。 即使你的计算机可以容纳模型权重,最大模型的权重现在已经达到几百GB,你还必须能够为优化…

Blender给一个对象添加多个动画

最近在做一个类似元宇宙的项目,需要使用3D建模软件来给3D模型添加动画,3D建模软件选择Blender(因为开源免费…),版本: V3.5 遇到的需求是同一个对象要添加多个动画,然后在代码里根据需要调取动画来执行。本…

兄弟,王者荣耀的段位排行榜是通过Redis实现的?

目录 一、排行榜设计方案1、数据库直接排序2、王者荣耀好友排行 二、Redis实现计数器1、什么是计数器功能?2、Redis实现计数器的原理(1)使用INCR命令实现计数器(2)使用INCRBY命令实现计数器 三、通过Redis实现“王者荣…

nginx-获取客户端IP地址

上有服务器与客户端中间是有nginx代理服务器的,上游服务器如何获取客户端真实ip地址? nginx代理服务器设置X-Forwarded-For的header参数,代理服务器通过remote_addr获取客户端ip地址,将ip地址写入nginx代理服务器的X-Forwarded-Fo…

ELK之LogStash介绍及安装配置

一、logstash简介 集中、转换和存储数据 Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。 Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的…

Linux系统USB摄像头测试程序(四)_视频旋转及缩放

下面的程序实现了视频的旋转及缩放,窗口中点击鼠标左键视频向左旋转,点击鼠标右键视频向右旋转并且视频缩小了二分之一。程序中首先把yvyv422转换成了RGB24,然后利用opencv进行了旋转和缩放,其后用sdl2进行了渲染。使用了ffmpeg、…

f4v如何格式转换mp4格式?分享几种好用转换方法

为了使视频文件格式更加通用,更容易在不同设备和平台上播放,需要将F4V格式转换为MP4格式。F4V是Adobe Flash Player使用的一种视频文件格式,而MP4格式是一种更通用的视频文件格式,几乎所有设备和平台都支持它。此外,MP…

微积分基本概念

微分 函数的微分是指对函数的局部变化的一种线性描述。微分可以近似地描述当函数自变量的取值作足够小的改变时,函数的值是怎样改变的。。对于函数 y f ( x ) y f(x) yf(x) 的微分记作: d y f ′ ( x ) d x d_y f^{}(x)d_x dy​f′(x)dx​ 微分和…

机器学习中XGBoost算法调参技巧

本文将详细解释XGBoost中十个最常用超参数的介绍,功能和值范围,及如何使用Optuna进行超参数调优。 对于XGBoost来说,默认的超参数是可以正常运行的,但是如果你想获得最佳的效果,那么就需要自行调整一些超参数来匹配你…