【ES】es介绍,使用spring-boot-starter-data-elasticsearch整合的ES来进行操作Es

文章目录

    • 倒排索引(Inverted Index)和正排索引(Forward Index)
    • es和MySQL对比
    • IK分词器的总结
    • mapping映射
    • 使用springboot整合的ES来进行操作Es
      • 1. 实体类中添加注解
      • 2. 编写Repository层
      • 3. 通过Repository进行增删改查

倒排索引(Inverted Index)和正排索引(Forward Index)

正排索引是一种以文档为单位的索引结构,它将文档中的每个单词或词组与其所在的文档进行映射关系的建立。正排索引通常用于快速检索指定文档的内容,可以根据文档的编号或其他标识符快速定位到文档的内容。

倒排索引是一种以单词或词组为单位的索引结构,它将每个单词或词组与包含该单词或词组的文档进行映射关系的建立。倒排索引通常用于根据关键词进行文档的检索,可以根据关键词快速找到包含该关键词的文档列表。

正排索引和倒排索引的主要区别在于索引结构的建立方式和使用场景。正排索引适用于需要快速定位到指定文档的场景,而倒排索引适用于根据关键词进行文档的检索和查询的场景。

下面是正排索引和倒排索引的示意图:

正排索引示意图:

文档1 -> 单词1, 单词2, ...
文档2 -> 单词3, 单词4, ...
文档3 -> 单词2, 单词5, ...

倒排索引示意图:

单词1 -> 文档1
单词2 -> 文档1, 文档3
单词3 -> 文档2
单词4 -> 文档2
单词5 -> 文档3

总的来说,正排索引和倒排索引是信息检索中常用的两种索引结构,它们在索引和搜索过程中发挥着不同的作用,对于不同的应用场景有着不同的优势。

正常情况下我们将Id设置为主键索引能够快速查询到某条记录,但是有些字段不方便创建索引,如名称,简介等字段,这时候就可以使用ES来进行创建索引

在这里插入图片描述

es和MySQL对比

在这里插入图片描述
分词器
安装完IK分词器后有两个常用的分词模式ik_max_wordik_smart

ik_max_word 分词会分的更细。
ik_smart 发现一个词后就不会再对分过的词进行重新分词
程序员 使用ik_max_word分词。会分为程序员程序 三个词
而使用ik_smart的话,则就分一个 程序员 一个词
各有优缺点

在这里插入图片描述

配置IK分词器的扩展字典,及禁用字典 在这里插入图片描述
在这里插入图片描述

IK分词器的总结

在这里插入图片描述

mapping映射

在这里插入图片描述

使用springboot整合的ES来进行操作Es

1. 实体类中添加注解

import cn.creatoo.system.domain.BdDataData;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;import java.time.format.DateTimeFormatter;/*** 资源表对应的实体类** @author shang tf* @version 1.0* @data 2023/12/22 11:47*/
@Data
@Document(indexName = "data")
public class BdDataDataVo {@Idprivate Long dataId;@Field(type = FieldType.Keyword)private String dataNo;@Field(type = FieldType.Keyword)private String resourceLink;@Field(type = FieldType.Keyword)private String exposeLink;@Field(type = FieldType.Keyword)private String coverLink;@Field(type = FieldType.Long)private Long audioTime;@Field(type = FieldType.Long)private Long videoTime;@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")private String resourceName;@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")private String resourceInfo;@Field(type = FieldType.Integer)private Integer resourceType;@Field(type = FieldType.Keyword)private String resourceFormat;@Field(type = FieldType.Long)private Long size;@Field(type = FieldType.Text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")private String tags;@Field(type = FieldType.Integer)private Integer carrier;@Field(type = FieldType.Keyword)private String contributor;@Field(type = FieldType.Keyword)private String author;@TableLogic(value = "0", delval = "1")private Integer isDel;@Field(type = FieldType.Keyword)private String gifLink;@Field(type = FieldType.Keyword)private String fileName;@Field(type = FieldType.Long)private Long direId;@Field(type = FieldType.Long)private Long createBy;@Field(type = FieldType.Keyword)private String createTime;@Field(type = FieldType.Long)private Long updateBy;@Field(type = FieldType.Keyword)private String updateTime;// 无参构造public BdDataDataVo() {}// 构造方法将BdDataData类转换为BdDataDataVopublic BdDataDataVo(BdDataData bdDataData) {this.dataId = bdDataData.getDataId();this.dataNo = bdDataData.getDataNo();this.resourceLink = bdDataData.getResourceLink();this.exposeLink = bdDataData.getExposeLink();this.coverLink = bdDataData.getCoverLink();this.audioTime = bdDataData.getAudioTime();this.videoTime = bdDataData.getVideoTime();this.resourceName = bdDataData.getResourceName();this.resourceInfo = bdDataData.getResourceInfo();this.resourceType = bdDataData.getResourceType();this.resourceFormat = bdDataData.getResourceFormat();this.size = bdDataData.getSize();this.tags = bdDataData.getTags();this.carrier = bdDataData.getCarrier();this.contributor = bdDataData.getContributor();this.author = bdDataData.getAuthor();this.isDel = bdDataData.getIsDel();this.gifLink = bdDataData.getGifLink();this.fileName = bdDataData.getFileName();this.direId = bdDataData.getDireId();this.createBy = bdDataData.getCreateBy();this.updateBy = bdDataData.getUpdateBy();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");if (ObjectUtil.isNotEmpty(bdDataData.getCreateTime())){String createTimeFormat =  bdDataData.getCreateTime().format(formatter);this.createTime = createTimeFormat;}if (ObjectUtil.isNotEmpty(bdDataData.getUpdateTime())){String updateTimeFormat = bdDataData.getUpdateTime().format(formatter);this.updateTime = updateTimeFormat;}}
}

2. 编写Repository层

import cn.creatoo.system.domain.vo.data.BdDataDataVo;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;import java.util.List;/*** @author shang tf* @version 1.0* @data 2023/12/29 10:55*/
@Repository
public interface BdDataDataRepository extends ElasticsearchRepository<BdDataDataVo, Long> {/*** 根据resourceName,resourceInfo,tags字段进行匹配* @param query* @return*/@Query("{\"multi_match\":{\"query\":\"?0\",\"fields\":[\"resourceName\", \"resourceInfo\", \"tags\"]}}")List<BdDataDataVo> findByQuery(String query);}

3. 通过Repository进行增删改查

package cn.creatoo.system;import cn.creatoo.system.dao.BdDataDataRepository;import cn.creatoo.system.domain.BdDataData;
import cn.creatoo.system.domain.vo.data.BdDataDataVo;
import cn.creatoo.system.mapper.BdDataDataMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.ArrayList;
import java.util.List;/*** @author shang tf* @version 1.0* @data 2023/12/29 10:27*/
@SpringBootTest
public class TestXXX {// MybatisPlus - 数据库的Mapper@Autowiredprivate BdDataDataMapper bdDataDataMapper;// ES 的Repository@Autowiredprivate BdDataDataRepository bdDataDataRepository;/*** 添加文档*/@Testpublic void testAddData() {BdDataData bdDataData = bdDataDataMapper.selectById(1739554563704041473L);BdDataDataVo bdDataDataVo = new BdDataDataVo(bdDataData);BdDataDataVo save = bdDataDataRepository.save(bdDataDataVo);System.out.println("save = " + save);}/*** 删除文档*/@Testpublic void deleteData() {bdDataDataRepository.deleteById(1739563811997585409L);//bdDataDataRepository.deleteAll();}/*** 根据条件查询,es会自动进行分词查询。将符合度高的放到前面*/@Testpublic void testSelectData() {List<BdDataDataVo> result = bdDataDataRepository.findByQuery("[阳光, 豁达]");for (BdDataDataVo bdDataDataVo : result) {System.out.println("bdDataDataVo = " + bdDataDataVo);}}/*** 添加数据库所有内容,*/@Testpublic void  init(){List<BdDataData> bdDataData = bdDataDataMapper.selectList(new QueryWrapper<>());List<BdDataDataVo> bdDataDataVos = new ArrayList<>();for (BdDataData bdDataDatum : bdDataData) {bdDataDataVos.add(new BdDataDataVo(bdDataDatum));}// 保存多个文档Iterable<BdDataDataVo> bdDataDataVos1 = bdDataDataRepository.saveAll(bdDataDataVos);for (BdDataDataVo bdDataDataVo : bdDataDataVos1) {System.out.println("bdDataDataVo = " + bdDataDataVo);}}
}

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

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

相关文章

【C++】手撕 Vector类

目录 1&#xff0c;vector类框架 2&#xff0c;vector () 3&#xff0c;pinrt() 4&#xff0c;vector(int n, const T& value T()) 5&#xff0c;vector(const vector& v) 6&#xff0c;vector(InputIterator first, InputIterator last) 7&#xff0c;~vector…

读书笔记1-C++ Primer Plus

C是在C语言基础上开发的一种集面向对象编程&#xff08;OOP&#xff09;、通用编程和传统的过程化编程于一体的编程语言。本书是根据2003年的ISO/ANSI C标准编写的&#xff0c;通过大量短小精悍的程序详细而全面地阐述了C的基本概念和技术。 全书分17章和10个附录&#xff0c;分…

深度学习——PIL和OpenCV

PIL 官方文档 格式互转 opencv cv2.imread() 参数&#xff1a; filepath&#xff1a;读入imge的完整路径 flags&#xff1a;标志位&#xff0c;{cv2.IMREAD_COLOR&#xff0c;cv2.IMREAD_GRAYSCALE&#xff0c;cv2.IMREAD_UNCHANGED} cv2.IMREAD_COLOR&#xff1a;默认参数&…

Leetcode每日一题:1599.经营摩天轮的最大利润

前言&#xff1a;本题是一道逻辑细节题&#xff0c;考察阅读理解并转化为代码的能力&#xff0c;很多细节 题目描述&#xff1a; 你正在经营一座摩天轮&#xff0c;该摩天轮共有 4 个座舱 &#xff0c;每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱&#xff0c;但…

Jetpack Compose中使用Android View

使用AndroidView创建日历 Composable fun AndroidViewPage() {AndroidView(factory {CalendarView(it)},modifier Modifier.fillMaxWidth(),update {it.setOnDateChangeListener { view, year, month, day ->Toast.makeText(view.context, "${year}年${month 1}月$…

JSON 详解

文章目录 JSON 的由来JSON 的基本语法JSON 的序列化简单使用stringify 方法之 replacerstringify 方法之 replacer 参数传入回调函数stringify 方法之 spacestringify 方法之 toJSONparse 方法之 reviver 利用 stringify 和 parse 实现深拷贝 json 相信大家一定耳熟能详&#x…

Apache Doris (五十五): Doris Join类型 - Colocation Join

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Colocation Join原理

Hive讲课笔记:内部表与外部表

文章目录 零、学习目标一、导言二、内部表1.1 什么是内部表1.1.1 内部表的定义1.1.2 内部表的关键特性 1.2 创建与操作内部表1.2.1 创建并查看数据库1.2.2 创建数据表1.2.3 插入表记录1.2.4 通过HDFS WebUI查看数据库与表 三、外部表2.1 什么是外部表2.2 创建与操作外部表2.2.1…

Idea如何从磁盘中应用 下载好的插件流程,安装zip压缩包。

1、将下载的插件文件&#xff08;通常是一个ZIP文件&#xff09;复制到IntelliJ IDEA的“plugins”文件夹中。 IDEA版本 2、重启IntelliJ IDEA。 3、在设置窗口中&#xff0c;选择左侧的“Plugins”。 4、选择之前复制到“plugins”文件夹中的插件文件&#xff0c;点击“OK”按…

【新手向】VulnHub靶场MONEYBOX:1 | 详细解析

MONEYBOX:1 安装靶机 作为一名新手&#xff0c;首先要配置好环境&#xff0c;才能进行下一步的操作。 将下载的ova文件导入VirtualBox。 VirtualBox下载地址&#xff1a;https://www.oracle.com/cn/virtualization/technologies/vm/downloads/virtualbox-downloads.html 选择…

JMeter(十六)-JMeter断言

十六、JMeter断言 1.简介 断言组件用来对服务器的响应数据做验证&#xff0c;常用的断言是响应断言&#xff0c;其支持正则表达式。虽然我们的通过响应断言能够完成绝大多数的结果验证工作&#xff0c;但是JMeter还是为我们提供了适合多个场景的断言元件&#xff0c;辅助我们来…

【数据结构】栈和队列(队列的基本操作和基础知识)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​ 目录 前言 队列 队列的概念和结构 队列的…

【操作系统】虚拟存储器

5.1 虚拟存储器概述 之前介绍的各种存储器管理方式有一个共同的特点&#xff0c;即它们都要求将一个作业全部装入内存后方能运行。于是&#xff0c;出现了下面这样两种情况&#xff1a; (1) 有的作业很大&#xff0c;其所要求的内存空间超过了内存总容量&#xff0c;作业不能全…

【PTA-C语言】实验七-函数与指针I

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 目录——实验七-函数与指针I 6-1 弹球距离&#xff08;分数 10&#xff09;6-2 使用函数输出一个整数的逆序数&#xff08;分数 10&#xff09;6-3 使用函数求最大公约数&#xff08;分数 10&#xff09;6-4…

用CSDN训练的InsCode AI创作博文:数据治理体系建设

想不想用AI帮我们写方案&#xff1f; 想尝试用CSDN提供的InsCode AI创作助手协助我们进行技术方案的创作&#xff0c;看看效果如何&#xff0c;能不能辅助我们日常的方案编写与创作&#xff1f;以前用ChatGPT也尝试过&#xff0c;但对于专业性更强的内容&#xff0c;还有表现的…

BIOS:计算机中的特洛伊木马

内容概述&#xff1a; 由于主板制造商在计算机启动时用来显示品牌徽标的图像分析组件相关的问题&#xff0c;多个安全漏洞&#xff08;统称为 LogoFAIL&#xff09;允许攻击者干扰计算机设备的启动过程并安装 bootkit。x86 和 ARM 设备都面临风险。主板固件供应链安全公司 Bin…

软件工程总复习笔记

软件工程课程复习提纲 文章目录 软件工程课程复习提纲一、基本知识点1. 软件工程的概念及目标2. 软件危机的概念及典型表现3. 瀑布模型的概念及特点4. 快速原型模型的特点5. 螺旋模型的基本思想6. 软件生命周期的概念及划分为哪几个阶段7. 软件需求的定义8. 常见的软件需求获取…

html-css-js移动端导航栏底部固定+i18n国际化全局

需求&#xff1a;要做一个移动端的仿照小程序的导航栏页面操作&#xff0c;但是这边加上了i18n国家化&#xff0c;由于页面切换的时候会导致国际化失效&#xff0c;所以写了这篇文章 1.效果 切换页面的时候中英文也会跟着改变&#xff0c;不会导致切换后回到默认的语言 2.实现…

R_handbook_作图专题

ggplot基本作图 1 条形图 library(ggplot2) ggplot(biopics) geom_histogram(aes(x year_release),binwidth1,fill"gray") 2 堆砌柱状图 ggplot(biopics, aes(xyear_release)) geom_bar(aes(fillsubject_sex)) 3 堆砌比例柱状图 ggplot(biopics, aes(xyear_rele…

DSL查询语法和RestClient查询文档

目录 DSL查询语法 DLS Query的分类 DSL Query基本语法 全文检索查询 精准查询 地理查询 复合查询 Function Score Query 复合查询 Boolean Query 搜索结果处理 排序 分页 分页 深度分页问题 深度分也解决方案 高亮 RestClient查询文档 快速入门 全文检索查…