Spring Data Elasticsearch 4.0 的新功能

工程 | Mark Paluch | 2020 年 5 月 27 日 | ...

本文延續了我們關於 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.+ 版本以來已被棄用。使用者應切換到 ElasticsearchRestTemplateReactiveElasticsearchTemplate

總體而言,此版本包含一些變更,可能需要對您的程式碼和網域模型進行一些更新。 您可以在參考文檔中找到完整的遷移指南。

改進的物件映射和實體定義

一個底層的變更,是將實體到 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
}
  1. 在 Elasticsearch 中,此欄位將被命名為 *last-name*,此映射會透明地處理

  2. 一個不包含時間資訊的日期屬性

  3. 另一個屬性,這次包含完整的日期和時間資訊

新的傳回類型

由於 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...
}

取得 Spring 電子報

透過 Spring 電子報保持聯繫

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進程。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔。

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

查看全部