首页 > 其他分享 >spring集成elasticsearch并实现基础功能

spring集成elasticsearch并实现基础功能

时间:2024-08-01 23:07:35浏览次数:15  
标签:集成 spring void springframework elasticsearch import org data

什么是elasticsearch?

  Elasticsearch 是一个基于 Lucene 的开源搜索引擎和分析引擎,它为结构化和非结构化的海量数据提供了实时的搜索、分析和可视化功能。Elasticsearch 是 Elastic Stack(也称为 ELK Stack)的核心组件之一,其他组件还包括 Kibana(用于数据可视化)、Logstash(用于数据收集和处理)。

es 主要是对数据进行搜索,分析,倒排。是一个开源的高扩展的分布式全文搜索引擎。近实时的搜索。

es 的特点:

1、搜索的数据对象大量的非结构化的文本

2、倒排索引

3、每个字段都可以被索引和搜索

docker拉取es镜像

yum install -y yum-utils device-mapper-persistent-data lvm2

docker search elasticsearch

docker pull elasticsearch:7.3.1

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"  -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" 3d3aa92f641f

  es中文分词插件

https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.3.1/elasticsearch-analysis-ik-7.3.1.zip

插件安装

mkdir /soft/ik

进入容器内部
docker exec -it elasticsearch /bin/bash
cd plugins
mkdir ik

回到外部
docker cp /soft/ik/. 73438a827b55:/usr/share/elasticsearch/plugins/ik

重启es

  引入依赖

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.4.2</version>
        </dependency>

  

 配置yml的地址

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
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.math.BigDecimal;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "subject_index",createIndex = false)
public class SubjectInfoEs {
    @Field(type = FieldType.Long)
    @Id
    private Long id;
    @Field(type = FieldType.Text, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
    private String subjectName;
    @Field(type = FieldType.Text, analyzer = "ik_smart")
    private String subjectAnswer;
    @Field(type = FieldType.Keyword)
    private String createUser;
    @Field(type = FieldType.Date, index = false)
    private Long createTime;

}

引入继承

ElasticsearchRepository类
import com.jingdianjichi.subject.infra.basic.entity.SubjectInfoEs;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;

@Component
public interface SubjectEsRepository extends ElasticsearchRepository<SubjectInfoEs, Long> {
}

  接口层

public interface SubjectEsService {
    void createIndex();
    void addDocs();

    void getDocs();

    void find();

    void search();

}

  接口实现层

import com.alibaba.fastjson.JSON;
import com.jingdianjichi.subject.infra.basic.entity.SubjectInfoEs;
import com.jingdianjichi.subject.infra.basic.esRepo.SubjectEsRepository;
import com.jingdianjichi.subject.infra.basic.service.SubjectEsService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.document.Document;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service("subjectEsService")
@Slf4j
public class SubjectEsServiceImpl implements SubjectEsService {
    @Resource
    private ElasticsearchRestTemplate elasticsearchRestTemplate;
    @Resource
    private SubjectEsRepository subjectEsRepository;

    @Override
    public void createIndex() {
        IndexOperations indexOperations =
                elasticsearchRestTemplate.indexOps(SubjectInfoEs.class);
        indexOperations.create();
        Document mapping = indexOperations.createMapping(SubjectInfoEs.class);
        indexOperations.putMapping(mapping);

    }

    @Override
    public void addDocs() {
        List<SubjectInfoEs> list = new ArrayList<>();
        list.add(new SubjectInfoEs(1l, "redis是什么", "redis是·缓存", "**", new Date().getTime()));
        list.add(new SubjectInfoEs(2l, "mysql是什么", "mysql是数据库", "**", new Date().getTime()));
        subjectEsRepository.saveAll(list);
    }

    @Override
    public void getDocs() {

    }

    @Override
    public void find() {
        subjectEsRepository.findAll().forEach(subjectInfoEs -> {
            log.info("subjectInfoEs:{}", JSON.toJSONString(subjectInfoEs));
        });

    }

    @Override
    public void search() {
        NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.matchQuery("subjectName", "redis"))
                .build();
        SearchHits<SubjectInfoEs> search = elasticsearchRestTemplate.
                search(nativeSearchQuery, SubjectInfoEs.class);
        List<SearchHit<SubjectInfoEs>> searchHits = search.getSearchHits();
        log.info("searchHits:{}", JSON.toJSONString(searchHits));

    }
}

  controller层

  @GetMapping("testCreateIndex")
    public void testCreateIndex() {
        subjectEsService.createIndex();
    }
    @GetMapping("addDocs")
    public void addDocs() {
        subjectEsService.addDocs();
    }
    @GetMapping("search")
    public void search() {
        subjectEsService.search();
    }
    @GetMapping("find")
    public void find() {
        subjectEsService.find();
    }

   索引成功创建并且添加文档

search以及find方法日志打印完成

22:43:06.848  [http-nio-3001-exec-1] INFO  
SubjectEsServiceImpl - searchHits:[{"content":{"createTime":1722522746532,"createUser":"**","id":1,"subjectAnswer":"redis是·缓存","subjectName":"redis是什么"},"highlightFields":{},"id":"1","index":"subject_index","innerHits":{},"score":0.6931472,"sortValues":[]}]
22:43:45.486  [http-nio-3001-exec-4] INFO  
SubjectEsServiceImpl - subjectInfoEs:{"createTime":1722522746532,"createUser":"**","id":1,"subjectAnswer":"redis是·缓存","subjectName":"redis是什么"}
22:43:45.486  [http-nio-3001-exec-4] INFO  
SubjectEsServiceImpl - subjectInfoEs:{"createTime":1722522746532,"createUser":"**","id":2,"subjectAnswer":"mysql是数据库","subjectName":"mysql是什么"}

  

标签:集成,spring,void,springframework,elasticsearch,import,org,data
From: https://www.cnblogs.com/azwz/p/18337757

相关文章

  • 基于SpringBoot+Vue+uniapp的横向课题信息管理系统的详细设计和实现(源码+lw+部署文档
    文章目录前言详细视频演示具体实现截图技术栈后端框架SpringBoot前端框架Vue持久层框架MyBaitsPlus系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 基于Java+SpringBoot+Vue的电竞交互管理系统设计与实现(源码+lw+部署文档+讲解等)
    文章目录前言项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......
  • SpringSecurity
    1.认证授权的概述1.1什么是认证?进入移动互联网时代,大家每天都在刷手机,常用的软件有微信、支付宝、头条,抖音等,下边拿微信来举例子说明认证相关的基本概念,在初次使用微信前需要注册成为微信用户,然后输入账号和密码即可登录微信,==输入账号和密码登录微信的过程就是认证==。系统......
  • Java/SpringCloud/RabbitMq/无感实现消息携带用户信息 --- 逻辑讲解、代码实现、图形
    一、需求:依据黑马商城hmall为例,用户下单创建订单后,交易服务trade-service向交换机topic发送消息,交换机topic路由到队列,购物车服务cart-service监听此队列,实现自动清空购物车。改造下单功能,将基于OpenFeign的清理购物车同步调用,改为基于RabbitMQ的异步通知:定义t......
  • Spring学习(四)三级缓存
    至此,总结一下三级缓存:singletonObjects:缓存经过了完整生命周期的beanearlySingletonObjects:缓存未经过完整生命周期的bean,如果某个bean出现了循环依赖,就会提前把这个暂时未经过完整生命周期的bean放入earlySingletonObjects中,这个bean如果要经过AOP,那么就会把代理对象放入early......
  • SpringBoot+Vue物流快递仓库管理系统-附源码与配套论文
    1.1研究背景 随着网络不断的普及发展,物流快递仓库管理系统依靠网络技术的支持得到了快速的发展,首先要从员工的实际需求出发,通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、驾驶员管理、仓库管理、配送管理、运输管理管理等功能,利用目前网络给......
  • 通过 GraalVM 在 Spring Boot 项目中运行 Python 脚本(强化学习)
    我想要完成的是通过GraalVM在SpringBoot项目中运行python脚本(在我的例子中是agent.py)。我已经安装了GraalVM(cejdk21)并给它一个路径。还在项目结构中定义并根据graalvm和graalvm的python更改了pom.xml。即使它给出了无法找到火炬模块的错误。我还有一个安装了......
  • vue集成svg大图拖拽无限放大缩小
        vue项目中根据实际CAD图为参考,以及参看项目实际现场,手动绘制了一张线体、堆垛机、库区货架svg图,集成到vue页面中,svg图中可以交互接收C#发送过来的singalR实时数据。接收singalR的实时数据并显示到vue中,这里不作展开讲,可以参看笔者另一篇文章《vue若依集成C#的singalR接......
  • 软件测试经理工作日常随记【7】-接口+UI自动化(多端集成测试)
    软件测试经理工作日常随记【7】-UI自动化(多端集成测试)自动化测试前篇在此前言今天开这篇的契机是,最近刚好是运维开发频繁更新证书的,每次更新都在0点,每次一更新都要走一次冒烟流程。为了不让我的美容觉被阉割!(bushi)为了方便同事儿,不用每次更新都求爷告奶地通知大家辛苦半夜......
  • spring整合Sa-token+gateway实现微信无业务关联登录
    1、RBAC是什么?Role-BasedAccessControl,中文意思是:基于角色(Role)的访问控制。这是一种广泛应用于计算机系统和网络安全领域的访问控制模型。简单来说,就是通过将权限分配给➡角色,再将角色分配给➡用户,来实现对系统资源的访问控制。一个用户拥有若干角色,每一个角色拥有若干权限。这......