目录
一、版本对应关系
Spring Boot | Spring Data Elasticsearch | Elasticsearch |
---|---|---|
2.4.x | 4.1.x | 7.9.x |
2.5.x | 4.2.x | 7.12.x |
2.6.x | 4.3.x | 7.15.x |
2.7.x | 4.4.x | 7.17.x |
本系统使用的spring boot版本为2.6.13,ElasticSearch版本是7.16.2
二、导入依赖
java
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
三、配置
1、application.yml
官网未介绍yml方式配置,但是也是可以使用的,不做复杂的设置的话,yml
即可
java
# 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
java
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、日志输出
java
logging:
file:
name: ./log/log.log
level:
root: info
org.springframework.data.elasticsearch.client.WIRE: trace
四、实体映射
java
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;
}
以下是对注释的讲解
java
@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
结合DocumentOperations
和SearchOperations
的接口ElasticsearchRestTemplate
是ElasticsearchOperations
的实现类
日常使用时,使用ElasticsearchRestTemplate
即可,代码如下
java
@Autowired
private ElasticsearchRestTemplate template;
1、操作索引
java
// 获取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
完成各种条件查询的示例
java
@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的数据持久层
java
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
注解内的createIndex
为true
时(默认为true
),则服务启动时会先检查索引是否存在,若不存在则会自动创建索引
2、默认的CRUD示例
java
// 增/改
Model model = new Model(1, "张三", 18, "上海市闵行区", LocalDateTime.now());
Model save = repository.save(model);
// 查
Optional<Model> optionalModel = repository.findById(1);
// 删
repository.deleteById(1);