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.mfbz.cn/a/94208.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.RabbitMQ介绍

一、MQ是什么?为什么使用它 MQ(Message Queue,简称MQ)被称为消息队列。 是一种用于在应用程序之间传递消息的通信方式。它是一种异步通信模式,允许不同的应用程序、服务或组件之间通过将消息放入队列中来进行通信。这…

三、Nginx 安装集

一、Nginx CentOS Yum 安装 1. 前置准备 # 默认情况 CentOS-7 中没有 Nginx 的源 # Nginx 官方提供了源,所以执行如下命令添加源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm2. 安装 # 安装 yum insta…

1.分布式电源接入对配电网影响分析

分布式电源接入对配电网影响分析 MATLAB代码:分布式电源接入对配电网影响分析 关键词:分布式电源 配电网 评估 参考文档:《自写文档,联系我看》参考选址定容模型部分; 仿真平台:MATLAB 主要内容&a…

限流算法深入

限流定义及目的 当系统流量达到系统或下游承受能力的阈值时对系统进行限流控制以防止系统或下游挂掉,减少影响面。 限流组成:阈值及限流策略。阈值是指系统单位时间接收到的请求qps总数;限流策略是指限流行业触发后对应的系统行为&#xff…

【分布式技术专题】「OSS中间件系列」Minio的文件服务的存储模型及整合Java客户端访问的实战指南

Minio的元数据 数据存储 MinIO对象存储系统没有元数据数据库,所有的操作都是对象级别的粒度的,这种做法的优势是: 个别对象的失效,不会溢出为更大级别的系统失效。便于实现"强一致性"这个特性。此特性对于机器学习与大数据处理非…

初学者必看!我的第一个Invideo人工智能文字生成视频

这是一个使用人工智能生成视频的在线平台。 主要功能包括: - 视频脚本自动生成:可以通过输入主题,由AI自动生成视频故事剧本。 - 人声合成:支持上传脚本,AI会合成自然的人声进行朗读。 - 视频制作:有多种视频模板可选择,支持上传自己的素材,一键生成完整视频。 - 特效和增…

基于Java+SpringBoot+Vue前后端分离美食推荐商城设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

2023年7月京东护发市场数据分析(京东数据产品)

如今,与面部护肤相比,多数消费者认为头皮也需要认真对待,这在年轻消费群体中体现的较为明显。 随着消费者对护发理念的认同感不断加深,人们日常居家洗护的步骤也更加精细、使用产品品类也愈加多样化。除传统的护发素、发膜等护发…

mac使用VsCode远程连接服务器总是自动断开并要求输入密码的解决办法

在mac中使用vscode远程连接服务器,时常会出现自动断开并要求重新输入服务器密码的问题,接下来让我们来解决它: 1、首先,在本地创建公钥: ssh-keygen 这条命令执行之后,出现提示直接回车即可;直…

Eclipse打jar包与JavaDOC文档的生成

补充知识点——Eclipse打jar包与JavaDOC文档的生成 1、Eclipse如何打jar包,如何运行jar包 Java当中编写的Java代码,Java类、方法、接口这些东西就是项目中相关内容,到时候我们需要把代码提供给甲方、或者是我们需要运行我们编写的代码&…

【python知识】用 Tkinter实现“剪刀-石头-布”和“弹球游戏 ”

一、提要 Tkinter是一个Python内置模块,它提供了一个简单易用的界面来创建GUI。 在实现一些动态的画面、如游戏还是需要一些创新性思维的。在本文中,我们将使用 Tkinter 探索 Python GUI 编程。我们将介绍 Tkinter 的基础知识,并演示如何使用…

React笔记(一)初识React

一、React概述 1、什么是react react的官网:React 用于构建用户界面的 JavaScript 库,它也是一个渐进式的用于构建用户界面的javascript框架 2、主要特征 声明式:使用原生JS编写的页面存在着开发效率低下、性能较差的情况,使用react大家就…

PAT 1136 A Delayed Palindrome

个人学习记录,代码难免不尽人意 A B C where A is the original number, B is the reversed A, and C is their sum. A starts being the input number, and this process ends until C becomes a palindromic number – in this case we print in the last line …

图文并茂:Python Tkinter从入门到高级实战全解析

目录 介绍什么是Tkinter?准备工作第一个Tkinter程序界面布局事件处理补充知识点 文本输入框复选框和单选框列表框弹出对话框 综合案例:待办事项列表总结 介绍 欢迎来到本篇文章,我们将带您深入了解如何在Python中使用Tkinter库来创建图形用…

拓世科技集团 | “书剑人生”李步云学术思想研讨会暨李步云先生九十华诞志庆

2023年,中国改革开放迎来了45周年,改革春风浩荡,席卷神州大地,45年间,中国特色社会主义伟大事业大步迈入崭新境界,一路上结出了饶为丰硕的果实。中华民族在这45年间的砥砺前行,不仅使中国的经济…

API 接口应该如何设计?如何保证安全?如何签名?如何防重?

说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全性呢&am…

机器学习-神经网络(西瓜书)

神经网络 5.1 神经元模型 在生物神经网络中,神经元之间相互连接,当一个神经元受到的外界刺激足够大时,就会产生兴奋(称为"激活"),并将剩余的"刺激"向相邻的神经元传导。 神经元模型…

周鸿祎为360智脑招贤纳士;LLM时代的选择指南;Kaggle大语言模型实战;一文带你逛遍LLM全世界 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 思否「齐聚码力」黑客马拉松,用技术代码让生活变得更美好 主页:https://pages.segmentfault.com/google-hacka…

38. 连续签到领金币数

文章目录 题目需求思路一实现一题目来源 题目需求 用户每天签到可以领1金币,并可以累计签到天数,连续签到的第3、7天分别可以额外领2和6金币。 每连续签到7天重新累积签到天数。 从用户登录明细表中求出每个用户金币总数,并按照金币总数倒…

【Go 基础篇】探索Go语言中Map的神奇操作

嗨,Go语言的学习者们!在编程世界中,Map是一个强大而又有趣的工具,它可以帮助我们高效地存储和操作键值对数据。Map就像是一本字典,可以让我们根据关键字(键)快速找到对应的信息(值&a…