【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.hqwc.cn/news/312522.html

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

相关文章

java零拷贝zero copy MappedByteBuffer

目录 调用操作系统的 mmap 未使用 mmap 的文件通过网络传输的过程 使用 mmap 的文件通过网络传输的过程 使用例子 调用操作系统的 sendfile() 在 java 中的具体实现 mmap的优劣 mmap 的不足 mmap 的优点 mmap 的使用场景 对于零拷贝&#xff08;zero copy&#xff09…

MCS接口技术----定时/计数,中断

目录 一.中断系统相关寄存器 1.51单片机中断系统的总体结构&#xff1a; 2.中断源的中断级别&#xff08;由高到低&#xff09;&#xff1a; 3.与中断有关的四个寄存器&#xff1a; &#xff08;1&#xff09;TCON---定时控制寄存器 &#xff08;2&#xff09;IE---中断允…

2024-01-01 力扣高频SQL50题目 练习笔记

1. 1661求机器平均运行时间 在做这道题的时候&#xff0c;我遇到了4个问题 # 求平均的问题 如何找到个数? -> 相减对应列值后,直接average 就行。因为avg就是自动确定要除的个数&#xff08;当然要联合正确的group by 分组&#xff09; # 怎么根据machine_id和process_id…

Spring系列:Spring如何解决循环依赖

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

LeetCode刷题--- 不同路径 III

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递…

ACES 增强版不丹水稻作物地图(2016-2022 年)

ACES 增强版不丹水稻作物地图&#xff08;2016-2022 年&#xff09; 用于改善粮食安全决策的 2016-2022 年年度作物类型稻米地图仍然是不丹的一项挑战。这些地图是与不丹农业部和 SERVIR 合作开发的。通过专注于发展不丹的科学、技术、工程和数学 (STEM)&#xff0c;我们共同开…

HTML进阶

列表、表格、表单 文章目录 列表、表格、表单01-列表无序列表有序列表定义列表 02-表格表格结构标签-了解合并单元格 03-表单input 标签input 标签占位文本单选框上传文件多选框下拉菜单文本域label 标签按钮 04-语义化无语义的布局标签有语义的布局标签 05-字符实体 01-列表 …

uni-app引入vant表单(附源码)

新建项目 下载安装vant npm i vant main.js引入 import { Form } from vant; import { Field } from vant;Vue.use(Form); Vue.use(Field);代码引入 <van-form submit"onSubmit"><van-fieldclass"rePwd"v-model"username"name"请…

ES应用_ES实战

依靠知识库使用es总结一些使用技巧。 1 快速入门 ES是将查询语句写成类似json的形式&#xff0c;通过关键字进行查询和调用。 1.1 创建 下面创建了一个主分片为5&#xff0c;副本分片为1的ES结构。ES本身是一种noschema的结构&#xff0c;但是可以通过指定mapping编程schema的…

C# 给方形图片切圆角

写在前面 在有些场景中&#xff0c;给图片加上圆角处理会让视觉效果更美观。 代码实现 /// <summary>/// 将图片处理为圆角/// </summary>/// <param name"image"></param>/// <returns></returns>private Image DrawTranspar…

Java实现树结构(为前端实现级联菜单或者是下拉菜单接口)

Java实现树结构&#xff08;为前端实现级联菜单或者是下拉菜单接口&#xff09; 我们常常会遇到这样一个问题&#xff0c;就是前端要实现的样式是一个级联菜单或者是下拉树&#xff0c;如图 这样的数据接口是怎么实现的呢&#xff0c;是什么样子的呢&#xff1f; 我们可以看看 …

基于 LangChain + GLM搭建知识本地库

一种利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 受GanymedeNil的项目document.ai和AlexZhangji创建的ChatGLM-6B Pull Request启发&#xff0c;建立了全流程可使用开源模…