SpringBoot整合ElasticSearch

目录

一、版本对应关系

二、导入依赖

三、配置

1、application.yml

2、Bean

3、日志输出

四、实体映射

五、CRUD

 1、操作索引

2、条件搜索

六、ElasticsearchRepository

1、新建一个Model的数据持久层

2、默认的CRUD示例


一、版本对应关系

Spring BootSpring Data ElasticsearchElasticsearch
2.4.x4.1.x7.9.x
2.5.x4.2.x7.12.x
2.6.x4.3.x7.15.x
2.7.x4.4.x7.17.x

本系统使用的spring boot版本为2.6.13,ElasticSearch版本是7.16.2

二、导入依赖

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

三、配置

1、application.yml

官网未介绍yml方式配置,但是也是可以使用的,不做复杂的设置的话,yml即可

# yml配置elasticsearch客户端地址(可配置项有限)
spring:
  elasticsearch:
    uris: http://127.0.0.1:9200 # elasticsearch 连接地址
    #username: elastic # 用户名
    #password: 123456 # 密码
    connection-timeout: 10s # 连接超时时间(默认1s)
    socket-timeout: 30s # 数据读取超时时间(默认30s)

2、Bean

import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.client.RestClients;
import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;

import java.time.Duration;

/**
 * @Author:jackma
 * @name:RestClientConfig
 * @Date:2024/7/20 22:32
 */
@Configuration
public class RestClientConfig extends AbstractElasticsearchConfiguration {
    @Bean
    @Override
    public RestHighLevelClient elasticsearchClient() {
        // 使用构建器来提供集群地址,设置默认值HttpHeaders或启用SSL。
        ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                // 设置连接地址
                .connectedTo("192.168.58.131:9200")
                // 可以设置多个地址
                // .connectedTo("127.0.0.1:9200", "127.0.0.1:9201")
                // 是否启用ssl
                // .usingSsl()
                // 设置连接超时时间
                .withConnectTimeout(Duration.ofSeconds(10))
                // 设置
                .withSocketTimeout(Duration.ofSeconds(30))
                // 设置用户名密码
                // .withBasicAuth("elastic", "123456")
                // 创建连接信息
                .build();
        // 创建RestHighLevelClient。
        return RestClients.create(clientConfiguration).rest();
    }
}

3、日志输出

logging:
  file:
    name: ./log/log.log
  level:
    root: info
    org.springframework.data.elasticsearch.client.WIRE: trace

四、实体映射

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDate;
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;

/**
 * 商品表
 * @TableName sys_model
 */
@TableName(value ="sys_model")
@Data
@Document(indexName = "sys_model")
public class Model implements Serializable {
    /**
     * 主键
     */
    @Id
    @TableId(value = "sys_id")
    @Field(type = FieldType.Keyword)
    private String sysId;

    /**
     * 对象Id
     */
    @TableField(value = "object_id")
    @Field(type = FieldType.Keyword)
    private String objectId;

    /**
     * 商品订单号
     */
    @TableField(value = "out_trade_no")
    @Field(type = FieldType.Keyword)
    private String outTradeNo;

    /**
     * 金额
     */
    @TableField(value = "total_amount")
    @Field(type = FieldType.Keyword)
    private String totalAmount;

    /**
     * 商品名称
     */
    @TableField(value = "subject")
    @Field(type = FieldType.Text)
    private String subject;

    /**
     * 是否支付 0 已支付 1未支付
     */
    @TableField(value = "is_pay")
    @Field(type = FieldType.Integer)
    private Integer isPay;

    /**
     * 是否有效
     */
    @TableField(value = "active")
    @Field(type = FieldType.Integer)
    private Integer active;

    /**
     * 创建时间
     */
    @TableField(value = "create_time")
    @Field(type = FieldType.Date)
    private LocalDate createTime;

    /**
     * 修改时间
     */
    @TableField(value = "update_time")
    @Field(type = FieldType.Date)
    private LocalDate updateTime;

    /**
     * 创建人
     */
    @TableField(value = "create_by")
    @Field(type = FieldType.Keyword)
    private String createBy;

    /**
     * 修改然
     */
    @TableField(value = "update_by")
    @Field(type = FieldType.Keyword)
    private String updateBy;

    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}

以下是对注释的讲解 

@Document :
应用于类级别,表示该类是映射到数据库的候选对象。
重要属性:
indexName :存储此实体的索引名称,可包含 SpEL 模板表达式。
createIndex :标记在存储库引导中是否创建索引,默认值为 true 。
versionType :版本管理的配置,默认值为 EXTERNAL 。
@Id :
应用于字段级别,标记用于标识目的的字段。
@Transient :
应用于字段,默认情况下所有字段都映射到文档,该注释使此字段不被包含。
@PersistenceConstructor :
标记从数据库实例化对象时要使用的给定构造函数,参数按名称映射到检索到的文档中的键值。
@Field :
应用于字段级别,定义字段属性。
属性包括:
name :字段在 Elasticsearch 文档中的名称,未设置时使用 Java 字段名称。
type :字段类型,如多种类型可选。
format 和日期类型的 pattern :日期类型必须定义。
store :标记是否存储原始字段值,默认值为 false 。
analyzer 、 searchAnalyzer 、 normalizer :用于指定自定义分析和正规化。
@GeoPoint :
将字段标记为 geo_point 数据类型,若字段是 GeoPoint 类实例可省略。
@ValueConverter :
定义用于转换给定属性的类,仅转换带注释的属性。
@Setting :
定义不同的索引设置。
参数包括:
useServerConfiguration :不发送任何设置参数,由 Elasticsearch 服务器配置确定。
settingPath :指定义必须在类路径中解析的设置的 JSON 文件。
shards :要使用的分片数,默认为 1 。
replicas :副本数,默认为 1 。
refreshIntervall :默认为 1s 。
indexStoreType :默认为 fs 。

五、CRUD

主要有以下4个类

  • IndexOperations 在索引级别定义操作,例如创建或删除索引。
  • DocumentOperations 定义根据其ID存储,更新和检索实体的操作。
  • SearchOperations 定义使用查询搜索多个实体的动作
  • ElasticsearchOperations 结合DocumentOperationsSearchOperations的接口
  • ElasticsearchRestTemplate 是ElasticsearchOperations的实现类

日常使用时,使用ElasticsearchRestTemplate即可,代码如下

@Autowired
private ElasticsearchRestTemplate template;

 1、操作索引

// 获取IndexOperations对象
IndexOperations indexOperations = template.indexOps(Model.class);
// 查
boolean exists = indexOperations.exists();
// 删
boolean delete = indexOperations.delete();
// 增
boolean flag = indexOperations.create();
// 设置Mapping
boolean mapping = indexOperations.putMapping();

2、条件搜索

使用 QueryBuilder 完成各种条件查询的示例

@Test
    void getInfoByCondition() {
        // 创建一个 matchAllQuery
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();

        // 条件查询:精确匹配
        QueryBuilder exactMatchQuery = QueryBuilders.termQuery("fieldName", "value");

        // 条件查询:范围匹配
        QueryBuilder rangeQuery = QueryBuilders.rangeQuery("numericField")
                .from(10)
                .to(20);

        // 条件查询:短语匹配
        QueryBuilder phraseMatchQuery = QueryBuilders.matchPhraseQuery("textField", "phrase");

        // 条件查询:布尔查询
        QueryBuilder boolQuery = QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("field1", "value1"))
                .mustNot(QueryBuilders.termQuery("field2", "value2"))
                .should(QueryBuilders.termQuery("field3", "value3"));

        // 条件查询:模糊匹配
        QueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("fieldName", "value");

        // 将查询构建器添加到搜索源构建器中
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(queryBuilder);
    }

六、ElasticsearchRepository

一个类似于Spring Data JPA的文档操作方法

1、新建一个Model的数据持久层

package com.elasticsearch.repository;

import com.elasticsearch.domain.Model;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

/**
 * @Author:jackma
 * @name:ModelRepository
 * @Date:2024/7/20 22:36
 */
@Repository
public interface ModelRepository extends ElasticsearchRepository<Model,String> {
}

建立此持久层后,如果User实体@Document注解内的createIndextrue时(默认为true),则服务启动时会先检查索引是否存在,若不存在则会自动创建索引

2、默认的CRUD示例

// 增/改
Model model = new Model(1, "张三", 18, "上海市闵行区", LocalDateTime.now());
Model save = repository.save(model);

// 查
Optional<Model> optionalModel = repository.findById(1);

// 删
repository.deleteById(1);
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是SpringBoot整合elasticsearch的步骤: 1. 引入elasticsearchspring-boot-starter-data-elasticsearch的依赖: ``` <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.12.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <version>2.4.5</version> </dependency> ``` 2. 配置elasticsearch连接信息: ``` spring.data.elasticsearch.cluster-nodes=localhost:9200 ``` 3. 创建实体类: ``` @Document(indexName = "my_index") public class MyEntity { @Id private String id; private String name; // getter and setter } ``` 4. 创建es的Repository: ``` public interface MyRepository extends ElasticsearchRepository<MyEntity, String> { } ``` 5. 在service中使用Repository: ``` @Service public class MyService { @Autowired private MyRepository myRepository; public void save(MyEntity entity) { myRepository.save(entity); } public List<MyEntity> search(String name) { return myRepository.findByName(name); } } ``` 6. 在controller中调用service: ``` @RestController public class MyController { @Autowired private MyService myService; @PostMapping("/save") public void save(@RequestBody MyEntity entity) { myService.save(entity); } @GetMapping("/search") public List<MyEntity> search(@RequestParam String name) { return myService.search(name); } } ``` 这样就可以通过SpringBoot整合elasticsearch实现数据的增删改查了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值