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}}}} |