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

news2024/11/25 22:27:45

文章目录

    • 倒排索引(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 {

    @Id
    private 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类转换为BdDataDataVo
    public 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
    @Autowired
    private BdDataDataMapper bdDataDataMapper;
    // ES 的Repository
    @Autowired
    private BdDataDataRepository bdDataDataRepository;

    /**
     * 添加文档
     */
    @Test
    public void testAddData() {
        BdDataData bdDataData = bdDataDataMapper.selectById(1739554563704041473L);
        BdDataDataVo bdDataDataVo = new BdDataDataVo(bdDataData);
        BdDataDataVo save = bdDataDataRepository.save(bdDataDataVo);
        System.out.println("save = " + save);
    }

    /**
     * 删除文档
     */
    @Test
    public void deleteData() {
        bdDataDataRepository.deleteById(1739563811997585409L);
        //bdDataDataRepository.deleteAll();
    }

    /**
     * 根据条件查询,es会自动进行分词查询。将符合度高的放到前面
     */
    @Test
    public void testSelectData() {
        List<BdDataDataVo> result = bdDataDataRepository.findByQuery("[阳光, 豁达]");
        for (BdDataDataVo bdDataDataVo : result) {
            System.out.println("bdDataDataVo = " + bdDataDataVo);
        }
    }

    /**
     * 添加数据库所有内容,
     */
    @Test
    public 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.coloradmin.cn/o/1343015.html

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

相关文章

学习Vue的key作用和原理

今天主要学习了列表渲染和key的作用和原理&#xff0c;先来说说列表渲染&#xff0c;顾名思义想要渲染列表最快的方式就是使用for循环&#xff0c;我们要学习的就是Vue中对标签实现for循环的语法&#xff0c;它和我们传统的js语法有些不同&#xff0c;它是先要有Vue实例中data的…

力扣热题100道-双指针篇

文章目录 双指针283.移动零11.盛最多水的容器15.三数之和42.接雨水 双指针 283.移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 …

C语言 volatile关键字

volatile关键字介绍 volatile 是一个关键字&#xff0c;用于修饰变量&#xff0c;表示该变量是易变的&#xff0c;即可能在任何时候被意外地改变。在多线程编程中&#xff0c;当多个线程同时访问同一个变量时&#xff0c;由于线程之间的交互和优化&#xff0c;可能会导致变量的…

亚信安慧AntDB数据库——通信运营商核心系统的全面演进

AntDB数据库源自通信运营商核心系统&#xff0c;经过15年的平稳运行和不断演进&#xff0c;成功跟随通信技术的升级步伐&#xff0c;逐步迈向5G时代&#xff0c;并且在这期间完成了8次大版本的迭代&#xff0c;为行业树立了技术领先的典范。其独特之处在于具备超融合架构&#…

vue本地缓存搜索记录(最多4条)

核心代码 //保存到搜索历史&#xff0c;最多存四个 item.name和item.code格式为&#xff1a;塞力斯000001var history uni.getStorageSync(history) || [];console.log("history", history)var index history.findIndex((items) > {return item.name items.nam…

通过nginx配置防御web漏洞

一、常见web漏洞 二、nginx防御策略&#xff1a; 要使用Nginx配置防御Web漏洞&#xff0c;可以采取以下措施&#xff1a; 禁用不必要的HTTP方法&#xff1a;Nginx默认启用了许多HTTP方法&#xff0c;如PUT、DELETE等。可以通过在Nginx配置中禁用不必要的HTTP方法来减少潜在的安…

Vue - 使用Element UI Upload / importExcelJs进行文件导入

1 情景一 需求背景&#xff1a;后端配合&#xff0c;点击"导入"按钮&#xff0c;弹出“导入”弹窗&#xff0c;将电脑本地Excel表格数据导入到页面中表格位置&#xff08;需要调用后端接口&#xff09;&#xff0c;而页面中表格通过后端接口获取最新数据。 实现思路…

学python一定要下载python吗,学python都需要什么软件

大家好&#xff0c;本文将围绕想学python都要下载什么软件展开说明&#xff0c;初学python需要安装什么软件是一个很多人都想弄明白的事情&#xff0c;想搞清楚学python一定要下载python吗需要先了解以下几个事情。 工欲善其事必先利其器。初学者在学Python的时候&#xff0c;往…

雷军称小米汽车不可能卖 9 万 9;杭州破获重大勒索病毒案丨 RTE 开发者日报 Vol.116

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

thinkphp+vue_mysql汽车租赁管理系统1ma2x

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 课题主要分为三大模块&#xff1a;即管理员模块、用户模块…

优维携手深职大共建“中国高校‘双碳’技能仿真操作系统”!

优维“双碳”战略合作高校 优维科技与深圳职业技术大学碳中和技术研究院&#xff08;深职碳研院&#xff09;签署战略合作协议&#xff0c;深化产学研&#xff0c;聚力创新“双碳”发展。在“双碳”目标大背景下&#xff0c;优维科技和深职碳研院将携手共同开发中国高校“双碳…

Django(四)

1.数据库操作 MySQL数据库 pymysql import pymysql# 1.连接MySQL conn pymysql.connect(host"127.0.0.1", port3306, userroot, passwd"root123", charsetutf8, dbunicom) cursor conn.cursor(cursorpymysql.cursors.DictCursor)# 2.发送指令 cursor.…

{MySQL} 数据库约束 表的关系 新增删除 修改 查询

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、数据库约束1.1约束类型&#xff1a;1.2 NULL约束1.3unique 唯一约束1.4 DEFAULT&#xff1a;默认值约束1.5 PRIMARY KEY&#xff1a;主键约束1.6 FOREIGN K…

Flowable中6种部署方式

1. addClasspathResource src/main/resources/processes/LeaveProcess.bpmn20.xml Deployment deploy repositoryService.createDeployment().name("请假审批").addClasspathResource("processes/LeaveProcess.bpmn20.xml").deploy();2. addInputStream…

QCheckBoxQRadioBoxQComboBoxQSlider

QCheckBox QCheckBox 是 Qt 框架中一个常用的控件&#xff0c;用于创建一个可以勾选或取消勾选的复选框。它通常用于表示选项的开/关状态 autoExclusive 是一个与单选按钮&#xff08;QRadioButton&#xff09;相关的属性。这个属性决定了同一个父窗口下的单选按钮是否自动形成…

利用NPS跟踪客户忠诚度:问卷调查实用指南与技巧分享

许多营销人员表示&#xff0c;净推荐值&#xff08;NPS&#xff09;是任何行业成功的主要衡量标准。同时&#xff0c;它也是衡量客户忠诚度的绝佳工具。我们可以将NPS问题引入问卷调查中&#xff0c;从而获取出真实的数据。NPS是怎么衡量顾客的&#xff1f;NPS将顾客分为推荐者…

力扣刷题记录(21)LeetCode:121、123、188、309

目录 121. 买卖股票的最佳时机 123. 买卖股票的最佳时机 III 188. 买卖股票的最佳时机 IV 309. 买卖股票的最佳时机含冷冻期 如果某一天出售股票可以得到最大利润&#xff0c;那么股票买入的价格一定是这天之前股票的最低价格。 所以我们可以在遍历股票价格的时候不断更新股…

OCP NVME SSD规范解读-4.NVMe IO命令-2

NVMe-IO-3&#xff1a; 由于设备具有掉电保护功能&#xff08;如Power Loss Protection&#xff0c;PLP&#xff09;&#xff0c;因此在以下情况下&#xff0c;性能不应降低&#xff1a; FUA&#xff08;Force Unit Access&#xff09;&#xff1a;是计算机存储设备中的一种命…

《别让猴子跳回背上》——管理者的时间管理

讲时间管理的书很多&#xff0c;但这本是专门讲给管理者的时间管理。 在职场中&#xff0c;许多管理者都会碰到工作计划执行不下去、组织目标难于实现的问题&#xff0c;搭进了自己所有可以支配的时间&#xff0c;仍旧是焦头烂额&#xff0c;顾此失彼&#xff1b;而下属则因为…

Linux 线程安全 (2)

文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 &#xff08;1&#xff09; 线程同步概念 竞态条件&#xff1a;因为时序问题&#xff0c;而导致程序异常. 饥饿问题&#xff1a;只使用互相锁保证线程安全时&#xff0c;锁资源总被某…