Spring Data Elasticsearch基本使用
Spring Data Elasticsearch基本使用
官网指南: https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#reference
1、maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2.、配置application.yml文件
# yml配置elasticsearch客户端地址(可配置项有限)
spring:
elasticsearch:
rest:
uris: http://192.168.220.101:9200 # elasticsearch 连接地址
username: elastic # 用户名
password: 123456 # 密码
connection-timeout: 10s # 连接超时时间(默认1s)
read-timeout: 30s # 数据读取超时时间(默认30s)
# 方便查询发送的http请求详细内容
logging:
file:
name: ./log/log.log
level:
root: info
org.springframework.data.elasticsearch.client.WIRE: trace
3. 实体类及注解
/**
* @Author dw
* @ClassName User
* @Description 实体映射
*
* 注解说明
* @Document:在类级别应用,以指示该类是映射到数据库的候选对象。最重要的属性是:
* indexName:用于存储此实体的索引的名称。它可以包含SpEL模板表达式,例如 "log-#{T(java.time.LocalDate).now().toString()}"
* type:映射类型。如果未设置,则使用小写的类的简单名称。(从版本4.0开始不推荐使用)
* shards:索引的分片数。
* replicas:索引的副本数。
* refreshIntervall:索引的刷新间隔。用于索引创建。默认值为“ 1s”。
* indexStoreType:索引的索引存储类型。用于索引创建。默认值为“ fs”。
* createIndex:标记是否在存储库引导中创建索引。默认值为true。请参见使用相应的映射自动创建索引
* versionType:版本管理的配置。默认值为EXTERNAL。
* @Id:在字段级别应用,以标记用于标识目的的字段。
* @Transient:默认情况下,存储或检索文档时,所有字段都映射到文档,此注释不包括该字段。
* @PersistenceConstructor:标记从数据库实例化对象时要使用的给定构造函数,甚至是受保护的程序包。构造函数参数按名称映射到检索到的Document中的键值。
* @Field:在字段级别应用并定义字段的属性,大多数属性映射到各自的Elasticsearch映射定义(以下列表不完整,请查看注释Javadoc以获得完整参考):
* name:字段名称,它将在Elasticsearch文档中表示,如果未设置,则使用Java字段名称。
* type:字段类型,可以是Text, Keyword, Long, Integer, Short, Byte, Double, Float, Half_Float,
Scaled_Float, Date, Date_Nanos, Boolean, Binary, Integer_Range, Float_Range, Long_Range, Double_Range,
Date_Range, Ip_Range, Object, Nested, Ip, TokenCount, Percolator, Flattened, Search_As_You_Type。请参阅Elasticsearch映射类型
* format和日期类型的pattern定义。必须为日期类型定义format
* store:标记是否将原始字段值存储在Elasticsearch中,默认值为false。
* analyzer,searchAnalyzer,normalizer用于指定自定义分析和正规化。
* @GeoPoint:将字段标记为geo_point数据类型。如果字段是GeoPoint类的实例,则可以省略。
*
* @Date 2021/5/11 21:55
* @Version 1.0
*/
@Document(indexName = "user", shards = 3, replicas = 0)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
private Integer id;
@Field(type = FieldType.Keyword)
private String name;
@Field(type = FieldType.Integer)
private Integer age;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String address;
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "uuuu-MM-dd'T'HH:mm:ss.SSSX")
private LocalDateTime createTime;
}
4、增删改查操作
Spring Data 的强大之处,就在于你不用写任何DAO处理,自动根据方法名或类的信息进行CRUD操作。只要你定义一个接口,然后继承Repository提供的一些子接口,就能具备各种基本的CRUD功能。
编写 UserRepository
@Repository
public interface UserRepository extends ElasticsearchRepository<User, Integer> {
List<User> findUsersByNameAndAddress(String name, String address);
}
自定义方法
Spring Data 的另一个强大功能,是根据方法名称自动实现功能。
比如:你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。
当然,方法名称要符合一定的约定:
Keyword | Sample | Elasticsearch Query String |
---|---|---|
And |
findByNameAndPrice |
{"bool" : {"must" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}} |
Or |
findByNameOrPrice |
{"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"price" : "?"}} ]}} |
Is |
findByName |
{"bool" : {"must" : {"field" : {"name" : "?"}}}} |
Not |
findByNameNot |
{"bool" : {"must_not" : {"field" : {"name" : "?"}}}} |
Between |
findByPriceBetween |
{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
LessThanEqual |
findByPriceLessThan |
{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
GreaterThanEqual |
findByPriceGreaterThan |
{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}} |
Before |
findByPriceBefore |
{"bool" : {"must" : {"range" : {"price" : {"from" : null,"to" : ?,"include_lower" : true,"include_upper" : true}}}}} |
After |
findByPriceAfter |
{"bool" : {"must" : {"range" : {"price" : {"from" : ?,"to" : null,"include_lower" : true,"include_upper" : true}}}}} |
Like |
findByNameLike |
{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}} |
StartingWith |
findByNameStartingWith |
{"bool" : {"must" : {"field" : {"name" : {"query" : "?*","analyze_wildcard" : true}}}}} |
EndingWith |
findByNameEndingWith |
{"bool" : {"must" : {"field" : {"name" : {"query" : "*?","analyze_wildcard" : true}}}}} |
Contains/Containing |
findByNameContaining |
{"bool" : {"must" : {"field" : {"name" : {"query" : "**?**","analyze_wildcard" : true}}}}} |
In |
findByNameIn(Collection<String>names) |
{"bool" : {"must" : {"bool" : {"should" : [ {"field" : {"name" : "?"}}, {"field" : {"name" : "?"}} ]}}}} |
NotIn |
findByNameNotIn(Collection<String>names) |
{"bool" : {"must_not" : {"bool" : {"should" : {"field" : {"name" : "?"}}}}}} |
Near |
findByStoreNear |
Not Supported Yet ! |
True |
findByAvailableTrue |
{"bool" : {"must" : {"field" : {"available" : true}}}} |
False |
findByAvailableFalse |
{"bool" : {"must" : {"field" : {"available" : false}}}} |
OrderBy |
findByAvailableTrueOrderByNameDesc |
{"sort" : [{ "name" : {"order" : "desc"} }],"bool" : {"must" : {"field" : {"available" : true}}}} |