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