領先一步
VMware 提供培訓和認證,以加速您的進程。
了解更多本文延續了我們關於 Spring Data Neumann 的新功能的系列部落格文章。 今天的文章解釋了 Spring Data Elasticsearch 中的新功能和值得注意的地方。 這篇部落格文章由 P.J. Meisch 撰寫,他維護著 Spring Data Elasticsearch 模組。
此版本解決了 140 多個問題,修復了 30 多個錯誤。
Spring Data Elasticsearch 現在使用 Elasticsearch 7,特別是 7.6.2。不再支援在 6.x 版本上執行的 Elasticsearch 叢集。ElasticsearchTemplate
類別已被棄用,因為它使用 TransportClient
存取 Elasticsearch,而 TransportClient
本身自 Elasticsearch 7.+ 版本以來已被棄用。使用者應切換到 ElasticsearchRestTemplate
或 ReactiveElasticsearchTemplate
。
總體而言,此版本包含一些變更,可能需要對您的程式碼和網域模型進行一些更新。 您可以在參考文檔中找到完整的遷移指南。
一個底層的變更,是將實體到 Elasticsearch 所需的 JSON 文件之間的映射,從使用 Jackson 切換到使用 MappingElasticsearchConverter
。 現在,可以為屬性定義自定義名稱,甚至為與時間相關的屬性定義不同的日期格式,而不會出現先前版本中曾經出現的問題。 MappingElasticsearchConverter 不僅轉換實體,還用於建構查詢和處理搜尋結果。 透過這種方式,映射和轉換會一致地應用於整個儲存和搜尋過程。
@Field
注釋現在支援幾乎所有可在 Elasticsearch 中使用的類型。
@Document(indexName = "person", type = "dummy")
public class Person implements Persistable<Long> {
@Nullable @Id
private Long id;
@Nullable @Field(value = "last-name", type = FieldType.Text, fielddata = true)
private String lastName; (1)
@Nullable @Field(name = "birth-date", type = FieldType.Date, format = DateFormat.basic_date)
private LocalDate birthDate; (2)
@CreatedDate
@Nullable @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
private Instant created; (3)
// other properties, getter, setter
}
在 Elasticsearch 中,此欄位將被命名為 *last-name*,此映射會透明地處理
一個不包含時間資訊的日期屬性
另一個屬性,這次包含完整的日期和時間資訊
由於 Elasticsearch 不僅在搜尋結果中傳回找到的實體,還傳回了大量額外資訊,因此引入了新的類別來提供這些資訊,其中最重要的是
SearchHit<T>
包含實體和資訊,例如 *score*、*sortvalues*、*highlight fields*
SearchHits<T>
包含搜尋的 *maxScore*、傳回的 *aggregations*、*totalCount* 和 SearchHit<T>
元素的列表。
這些是從對 (Reactive)ElasticsearchOperations
的呼叫中傳回的。
若要在儲存庫方法中使用它們,只需將它們定義為傳回類型即可(儲存庫也支援分頁請求)。 由於現在可以在 SearchHit
中存取 highlight 值,因此儲存庫方法現在可以針對 highlight 進行配置,如第一個方法所示
@Highlight(fields = {@HighlightField(name = "firstName")})
List<SearchHit<Person>> findByFirstName(String firstName);
Stream<SearchHit<Person>> findByBirthDateAfter(LocalDate date);
SearchHits<Person> findByLastName(String lastName);
SearchPage<Person> searchByLastName(String name, Pageable pageable);
當然,仍然可以透過將傳回類型定義為 List<Person>
來僅檢索實體。
反應式和非反應式用戶端都可以配置其他參數
SSL 支援,可選地使用自定義 SSLContext
Proxy 支援
自定義 header supplier,可動態地為發送到叢集的每個請求提供 header
pathPrefix 用於 Elasticsearch 叢集位於某些 Loadbalancer 或 dispatcher 後面的情況
現在可以定義實體回呼,下表顯示了支援的回呼
回呼
方法
描述
ReactiveBeforeConvertCallback
BeforeConvertCallback
onBeforeConvert(T, IndexCoordinates)
在將網域物件轉換為 Document
之前調用。
可以傳回 entity
或修改後的實體,然後將其轉換。
ReactiveAfterConvertCallback
AfterConvertCallback
onAfterConvert(T, Document, IndexCoordinates)
在從 Document
轉換網域物件之後調用
在從 Elasticsearch 讀取結果資料時。
ReactiveAuditingEntityCallback
AuditingEntityCallback
onBeforeConvert(Object, IndexCoordinates)
將可稽核實體標記為已建立或已修改
ReactiveAfterSaveCallback
AfterSaveCallback
T onAfterSave(T, IndexCoordinates)
在儲存網域物件之後調用。
建立在 AuditingEntityCallback
之上的是對稽核的支援。 透過實作 Persistable<T>
並新增帶註釋的屬性,這些值將自動維護儲存在 Elasticsearch 中的實體
@Document(indexName = "person")
public class Person implements Persistable<Long> {
@Nullable @Id
private Long id;
@CreatedDate
@Nullable @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
private Instant created;
@Nullable @CreatedBy
private String createdBy;
@LastModifiedDate
@Nullable @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
private Instant lastModified;
@Nullable @LastModifiedBy
private String lastModifiedBy;
@Nullable
public Long getId() { return id; }
@Override
public boolean isNew() { return id == null || (createdBy == null && created == null); }
// other properties, getter, setter...
}