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

news/2024/7/7 5:55:29 标签: elasticsearch, 大数据

文章目录

    • 倒排索引(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.niftyadmin.cn/n/5293187.html

相关文章

深入理解通用的HTTP POST请求发送方法

深入理解通用的HTTP POST请求发送方法 代码解析&#xff1a; 在现代的软件开发中&#xff0c;与服务端进行HTTP通信是一项基础而重要的任务。本篇博客将深入研究并详细解释一个通用的HTTP POST请求发送方法&#xff0c;该方法使用了 RestTemplate 库来简化HTTP通信。我们将逐…

探究公有云中的巨人:深入分析大数据产品的架构设计

目录 一、服务器分类 二、公有云基础和产品 网络 vpc专有网络 弹性公网IP(Elastic IP)

Rust编程语言入门_第三章_通用编程概念

文章目录 第三章 通用编程概念3.1 变量与可变性3.1.1 变量3.1.2 常量3.1.3 Shadowing&#xff08;隐藏&#xff09; 3.2 数据类型3.2.1 标量类型3.2.2 整数类型3.2.2.1 基础介绍3.2.2.2 isize 和 usize3.2.2.3 整数字面值3.2.2.4 整数溢出 3.2.3 浮点类型3.2.3.1 基础介绍3.2.3…

【Linux】深挖进程地址空间

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉【Linux】进程地址空间 > 毒鸡汤&#xff…

js中的 == 比较规则

前言 在 js 中&#xff0c; 是一种宽松相等运算符&#xff0c;它会在比较两个操作数时&#xff0c;尝试进行类型转换&#xff0c;以便比较它们的值 如果类型不同是&#xff0c;两边的值都尽量转成number。 的比较规则如下&#xff1a; 如果操作数具有相同的类型&#xff0c;则…

Python开发雷点总结

数值运算&#xff08;加减乘除&#xff09; 1. invalid value赋值 当变量本身具有数值属性&#xff08;后续会参加数值运算&#xff09;&#xff0c;对invalid value设置应该为np.nan&#xff0c; 而非None&#xff1b;反之&#xff0c;容易抛出以下错误&#xff1a; TypeEr…

关于 K8s 的一些基础概念整理

〇、前言 Kubernetes&#xff0c;将中间八个字母用数字 8 替换掉简称 k8s&#xff0c;是一个开源的容器集群管理系统&#xff0c;由谷歌开发并维护。它为跨主机的容器化应用提供资源调度、服务发现、高可用管理和弹性伸缩等功能。 下面简单列一下 k8s 的几个特性&#xff1a; 自…

spring核心技术之依赖注入DI

[[toc]] DI Dependency Injection 依赖注入个解:DI是IOC的一种实现方式,bean文件定义数据,通过构造函数或set方式注入到java类中构造函数注入 数据部分:bean constructor-arg节点逻辑部分:构造函数注入<bean id="helloService" class="io.spring.hello…