Elasticsearch 8 釋出,相容 7.x API、新的 KNN 搜尋 API

2022-02-11 17:00:06

Elasticsearch 是一個基於 Lucene 庫的搜尋引擎。它提供了一個分散式、支援多租戶的全文搜尋引擎,具有 HTTP Web 介面和無模式 JSON 檔案。Elasticsearch 是用 Java 開發的,並在 Apache 許可證下作為開源軟體釋出。官方使用者端在 Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby 和許多其他語言中都是可用的。

時隔近三年,Elasticsearch 8 正式釋出,新增的功能包括:

7.x REST API 相容性

8.0 為 Elasticsearch REST APIs 引入了一些重大的變化。雖然更新你的應用程式以適應這些變化十分重要,但在升級後尋找和更新每一個 API 呼叫可能對開發者而言十分痛苦且容易出錯。為了使這個過程變得更加容易,Elasticsearch 已經在 REST API 中增加了對 7.x 相容性 header 的支援。這些可選的 header 檔案讓你向 8.0 叢集發出 7.x 相容的請求,並收到 7.x 相容的響應。

雖然官方仍然建議開發者更新你的應用程式以使用原生的 8.0 請求和響應,但 7.x API 相容 header 檔案讓你可以在更長的時間內安全地進行這些更改。

安全功能在預設情況下被啟用和設定

在沒有安全保障的情況下執行 Elasticsearch 會讓你的叢集暴露在任何可以向 Elasticsearch 傳送請求的使用者面前。在以前的版本中,你必須明確地啟用 Elasticsearch 的安全功能,如認證、授權和網路加密(TLS)。從 Elasticsearch 8.0 開始,當第一次啟動 Elasticsearch 時,安全功能被預設啟用和設定。

在啟動時,Elasticsearch 8.0 會生成註冊令牌,你可以用它來連線 Kibana 範例或在安全的 Elasticsearch 叢集中註冊其他節點,而無需生成安全證書或更新 YAML 組態檔。只需在啟動新節點或 Kibana 範例時使用生成的註冊令牌,Elastic Stack 就會為你處理所有安全設定。

已知問題:

  • 如果你在 Linux ARM 或 macOS M1 等 arch64 平臺上從歸檔中安裝 Elasticsearch,那麼在首次啟動節點時,不會自動生成 elastic 使用者密碼和 Kibana 註冊令牌。節點啟動後,需要用 bin/elasticsearch-reset-password 工具生成 elastic 密碼:
bin/elasticsearch-reset-password -u elastic
  • 然後,用 bin/elasticsearch-create-enrollment-token 工具為 Kibana 建立一個註冊令牌: 
bin/elasticsearch-create-enrollment-token -s kibana

更好地保護系統索引

系統索引為 Elastic 功能儲存設定和內部資料。一般來說,系統索引僅保留供這些功能內部使用。雖然有可能,但直接存取或改變系統索引會導致不穩定和其他問題。

在 Elasticsearch 8.0 中做了一些改變來保護系統索引不被直接存取。要存取系統索引的話,使用者現在必須把 allow_restricted_indices 許可權設定為 true

superuser 角色也不再給予系統索引的寫入許可權。因此,內建的 elastic superuser 預設不能改變系統索引。

此後,開發者應使用 Kibana 或相關的 Elasticsearch APIs 來管理某個功能的資料,而不是存取系統索引。如果你直接存取系統索引,Elasticsearch 將在 API 響應的 header 中和廢棄紀錄檔中返回警告。

新的 KNN 搜尋 API

Elasticsearch 8.0 中推出了 KNN 搜尋 API 的技術預覽版。通過使用 dense_vector 欄位,k-nearest neighbor(KNN)搜尋可以找到與查詢向量最近的 k 個向量(這是由相似度指標來衡量的)。KNN 通常被用來支援推薦引擎和基於自然語言處理(NLP)演演算法的相關性排名。

以前,Elasticsearch 只支援精確的 KNN 搜尋,使用帶向量函數的 script_score 查詢。雖然這種方法保證了準確的結果,但它往往導致搜尋速度緩慢,而且在大型資料集上不能很好地擴充套件。作為對較慢的索引和不完美的準確性的交換,新的 KNN 搜尋 API 讓你在更大的資料集上以更快的速度執行近似的 KNN 搜尋。

keywordmatch_only_texttext 欄位節省儲存空間

該版本更新了倒排索引,這是一個內部資料結構,可以使用更節省空間的編碼。這一變化將使 keywordmatch_only_text 欄位以及 text 欄位受益。在使用應用程式紀錄檔的基準測試中,這一轉變為 message 欄位(對映為 match_only_text)的索引大小減少了 14.4%,總體上減少了 3.5% 的磁碟佔用空間。

加快 geo_pointgeo_shape 和範圍欄位索引速度

新版本優化了多維點(multi-dimensional points)的索引速度,多維點是用於 geo_pointgeo_shape 和範圍欄位的內部資料結構。Lucene 級別的基準測試顯示,這些欄位型別的索引速度提高了 10-15%。主要由這些欄位組成的 Elasticsearch 索引和資料流可能會在索引速度方面有顯著的改進。

PyTorch 模型支援自然語言處理(NLP)

現在可以上傳在 Elasticsearch 之外訓練的 PyTorch 模型,並使用它們進行推理。第三方模型支援為 Elastic Stack 帶來了現代自然語言處理(NLP)和搜尋用例。

其他變化

Aggregations:

  • 刪除鄰接 matrix 設定 (issues: , )
  • 刪除 MovingAverage 管道聚合
  • 刪除棄用的 _time_term 排序
  • 刪除棄用的日期歷史間隔

Allocation:

  • 刪除include_relocations設定 (issues: , )

Analysis:

  • 清理分析中的版本化棄用 (issue: )
  • 刪除預先設定的 delimited_payload_filter (issues: , )

Authentication:

  • 除非明確禁用,否則始終新增檔案和本機 Realm (issue: )
  • 預設情況下不要在 Policy 中設定 NameID 格式 (issue: )
  • 為 Realm 設定強制設定順序 (issue: )

Cluster Coordination:

  • 刪除連線超時 (issue: )
  • 刪除對延遲狀態恢復掛起主控器的支援 (issue: )

Distributed:

  • 刪除同步重新整理 (issues: , )
  • 刪除 cluster.remote.connect設定 (issue: )

Engine:

  • 強制合併應該拒絕設定了only_expunge_deletesmax_num_segments的請求 (issue: )
  • 刪除每個型別的索引統計 (issue: )
  • 移除 translog 保留設定 (issue: )

Features/CAT APIs:

  • _cat/indices 刪除廢棄的 local 引數 (issue: )
  • _cat/shards 刪除廢棄的 local 引數 (issue: )

Features/ILM+SLM:

  • 預設cluster.routing.allocation.enforce_default_tier_preferencetrue (issues: , )

Features/Indices APIs

  • prefer_v2_templates引數預設值設為 true (issues: , )
  • 刪除棄用的_upgrade API (issue: )
  • 從 REST 層移除引數 include_type_name
  • 刪除索引模板中的template欄位 (issue: )

Infra/Core

  • 從資料路徑中刪除nodes/0資料夾字首
  • 刪除bootstrap.system_call_filter設定
  • 刪除node.max_local_storage_nodes (issue: )
  • 刪除 Joda 依賴
  • 刪除命名日期/時間格式的駝峰式大小寫
  • ……

Packaging

  • 刪除 SysV 初始化支援
  • 刪除對JAVA_HOME 的支援
  • 需要 Java 17 才能執行 Elasticsearch

……

更多詳情可檢視:

展開閱讀全文