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查询,然后自动帮你完成,无需写实现类。
当然,方法名称要符合一定的约定:

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

 

 

 

 

 

posted @ 2021-05-11 23:18  邓维-java  阅读(4132)  评论(0)    收藏  举报