作者:來自 Elastic 公司?Quentin_Pradet
早在 2022 年 2 月,當 Elasticsearch 8.0 發(fā)布時,Python 客戶端也發(fā)布了 8.0 版本。 它是 7.x 客戶端的部分重寫,并附帶了許多不錯的功能(概述如下),但也有棄用警告和重大更改。 如今,7.17 版客戶端仍然相對受歡迎,每月下載量超過 100 萬次,約占 8.x 下載量的 50%。
作為 Elasticsearch Python 客戶端的新維護者,我希望我們的社區(qū)能夠從我們在客戶端中所做的改進中受益,通過幫助所有 elasticsearch-py 用戶:
- 幫助 7.17 用戶遷移到 8.x,
- 幫助 8.x 用戶利用新功能。
根據(jù)我作為 urllib3 維護者的經(jīng)驗,我知道投資 urllib3 2.0 遷移指南?并幫助用戶遷移是有回報的。 同樣,我們現(xiàn)在正在努力通過刪除棄用警告和重大更改來使 elasticsearch-py 8.x 更易于使用。 這篇文章重點介紹了升級到 8.x 的充分理由:這些理由在近兩年內(nèi)都是如此,但最近的理由也是如此。 順便說一句,如果你已經(jīng)確信,請查看我們的遷移指南(如果你遇到困難,請務必聯(lián)系我們?。?/p>
Migrating to 8.0 | Elasticsearch Python Client [8.11] | Elastic文章來源地址http://www.zghlxwxcb.cn/news/detail-804800.html
話不多說,以下是使用 elasticsearch-py 8.x 的十個理由。
1. 支持最新的 Elasticsearch API
Elasticsearch 8 是 Elasticsearch 的最佳版本,全面進行了許多改進,并大大增加了可擴展性。更重要的是,對于我們對 Python 客戶端的討論,添加了各種新的 API:
- 使用 _search API 的 knn 選項進行向量搜索(8.5,替換 8.0 中引入的 _knn_search API)
- 執(zhí)行模型推理 API (8.11) 和訓練模型 API (8.5)
- 搜索應用程序 (8.8)、查詢規(guī)則 (8.10) 和同義詞 API (8.10)
由于客戶端是根據(jù) Elasticsearch 規(guī)范生成的,因此可以保證獲得最新、最好的 API。
2. Elasticsearch DSL 客戶端 8.x
Elasticsearch DSL 客戶端 ?是一個高級庫,其目的是幫助以更簡潔的方式編寫和運行針對 Elasticsearch 的查詢。 使用與之前文章相同的 christmas_characters 索引作為示例:
response = client.search(
index="christmas_characters",
query={
"bool": {
"must": [{"match": {"behavior": "good"}}]
}
}
)
for hit in response['hits']['hits']:
print(hit['_score'], hit['_source']['title'])
變成:
s = Search(using=client, index="christmas_characters").query("match", behavior="good")
for hit in s.execute():
print(hit.meta.score, hit.title)
你要么喜歡它的簡潔性,要么討厭學習新的 DSL,但這個客戶端非常受歡迎,每月下載量超過 300 萬次,并擁有專門的用戶群。 它過去維護得很差,一直停留在 7.4.1 版本,但我在 9 月份發(fā)布了 8.9.0 版本,這是第一個與主要 Python 客戶端版本 8 兼容的版本。
我致力于維護它,并于上個月發(fā)布了 8.11.0,以支持 Python 3.12 并允許折疊(collapsing queries)查詢(相關 GitHub 問題已累積 38 票!)。
3.?種類型提示和更多 Pythonic API
從 Elasticsearch Python 客戶端的早期(早在 2013 年 7 月起!)開始,body 參數(shù)就是為接受它的請求指定請求正文的方法。 使用 body 的 API 調(diào)用如下所示:
es.search(
index="christmas_characters",
body={
"query": {"match_all": {}},
"size": 50,
}
)
然而,這個參數(shù)是一個無類型的 Python 字典,沒有經(jīng)過客戶端驗證,這意味著在將請求發(fā)送到服務器之前你無法判斷你的請求是否正確。 但你不想了解生產(chǎn)中的基本問題! 因此,elasticsearch-py 8.0 利用 Elasticsearch 規(guī)范引入了更好的 API,該規(guī)范提供了每個 API 的完整類型。 第一層主體鍵可以使用 Python 參數(shù)指定:
es.search(
index="christmas_characters",
query={"match_all": {}},
size=50,
)
這具有多種優(yōu)點,包括更好的自動完成和類型檢查。 例如,如果 size 不是整數(shù),mypy 將引發(fā)錯誤。 因為我們意識到我們可以將 body unpack?為類型化參數(shù),如下所示:
es.search(
index="christmas_characters",
**{"query": {"match_all": {}}, "size": 50}
)
我們決定在 elasticsearch-py 8.0 中完全棄用 body 參數(shù)。
4. 恢復 body 參數(shù)
然而,棄用 body 有以下缺點:
- 過去十年編寫的許多代碼現(xiàn)在都觸發(fā)了棄用警告
- 未知參數(shù)(例如 sub_searches 或 Elasticsearch 規(guī)范中的無意遺漏)被拒絕,導致查詢徹底失敗,不必要地強制使用原始請求。
- 諸如傳遞已編碼主體以避免支付序列化 JSON 成本之類的優(yōu)化已不再可能。
客戶端的原作者 Honza Král 指出了這些問題 ,我們決定讓 body 與新 API 一起像以前一樣工作,沒有任何警告。 這將在 elasticsearch-py 8.12 中提供,我們希望這將有助于 elasticsearch-py 8.x 的采用。
5. 記錄調(diào)試請求
elasticsearch-py 8.x 客戶端基于 elastic-transport 庫,可以作為不同客戶端的基礎。 該庫引入了一個非常有用的功能來調(diào)試請求和響應,通過調(diào)用 elastic_transport.debug_logging() 來啟用。
import elastic_transport
from elasticsearch import Elasticsearch
# In this example we're debugging an Elasticsearch client:
client = Elasticsearch(...)
# Use `elastic_transport.debug_logging()` before the request
elastic_transport.debug_logging()
client.search(
index="christmas_characters",
query={
"bool": {
"must": [{"match": {"behavior": "good"}}]
}
}
)
上述腳本將輸出以下日志:
[2021-11-23T14:11:20] > POST /example-index/_search?typed_keys=true HTTP/1.1
> Accept: application/json
> Accept-Encoding: gzip
> Authorization: Basic <hidden>
> Connection: keep-alive
> Content-Encoding: gzip
> Content-Type: application/json
> User-Agent: elastic-transport-python/8.11.0+dev
> X-Elastic-Client-Meta: es=8.11.0p,py=3.12.0,t=8.11.0p,ur=2.1.0
> {"query":{"match":{"text-field":"value"}}}
< HTTP/1.1 200 OK
< Content-Encoding: gzip
< Content-Length: 165
< Content-Type: application/json;charset=utf-8
< Date: Tue, 12 Dec 2022 20:11:20 GMT
< X-Cloud-Request-Id: ctSE59hPSCugrCPM4A2GUQ
< X-Elastic-Product: Elasticsearch
< X-Found-Handling-Cluster: 40c9b5837c8f4dd083f05eac950fd50c
< X-Found-Handling-Instance: instance-0000000001
< {"hits":{...}}
從我了解到這個功能的那天起,這個功能就成為了我開發(fā)工作流程的重要組成部分,現(xiàn)在我在其他客戶端中懷念它:它就是那么好!
6. 全鏈 SSL/TLS 指紋固定
當通過 HTTPS 與 Elasticsearch 通信時(這是從 Elasticsearch 8 開始的默認設置),客戶端需要能夠驗證服務器正在使用的證書,就像你的瀏覽器在獲取單詞之前必須驗證 discuss.elastic.co 的證書一樣 您當前正在閱讀。 這是通過跟蹤證書鏈直至根證書頒發(fā)機構(gòu)(根 CA)來實現(xiàn)的。 但是,該根 CA 不一定是已受信任的通用根 CA,而可能是整個公司使用的企業(yè)根 CA,甚至可能是 Elasticsearch 為單個集群生成的根 CA。
在這些情況下,有兩種方法可以正確驗證證書:
- 將相關的證書頒發(fā)機構(gòu)存儲在文件中,并配置 ca_certs 參數(shù)。 然而,存儲此文件需要額外的步驟,并且訪問公共證書并不總是那么容易。
- 指定集群中每個節(jié)點的 SSL 指紋,以確保每個節(jié)點的證書永遠不會改變。 但是,你需要為每個節(jié)點執(zhí)行此操作,這對于較大的集群來說在實踐中是不可能的。
值得慶幸的是,作為 Python 信任存儲工作的一部分,前 Elasticsearch Python 客戶端維護者 Seth Larson 意識到,使用 Python 3.10+ 私有 API ,可以固定根 CA 的指紋,從而允許驗證所有節(jié)點的證書,從而帶來 兩全其美的。 請參閱配置| Elasticsearch Python 客戶端 [8.11] | Elastic?適用于 Python 客戶端中有關 TLS 的所有選項。
7. options() API
在 elasticsearch-py 7.x中,客戶端 API 方法中允許使用每個請求選項,例如 api_key 和 ignore。 然而,這很令人困惑,因為它混合了傳輸級參數(shù)和 API 級參數(shù)。 現(xiàn)在已棄用,因為 elasticsearch-py 8.x 引入了 options() API,轉(zhuǎn)換:
client.search(index="christmas_characters", request_timeout=10)
為:
client.options(request_timeout=10).search(index="christmas_characters")
有關詳細信息,請參閱遷移指南。
8. 改進文檔
當前的主要焦點是改進 Python 客戶端的文檔。
API 參考按命名空間劃分,以減少類似名稱的 API(如 es.exists 和 es.indices.exists)之間的混淆。
它還包括內(nèi)聯(lián)類型提示:
最后,添加了 快速入門 和?交互式示例?頁面。
9.無服務器 - serverless
Elastic 的最新產(chǎn)品 Serverless 有一個專用的 Elasticsearch Python 客戶端 elasticsearch-serverless-python,其中僅包含 Serverless 支持的 API 和選項。
也就是說,默認的 Python 客戶端 elasticsearch-py 也支持 Serverless,這使得你可以輕松地使用現(xiàn)有代碼嘗試 Serverless!
10. 生成式人工智能
Elastic 在 Generative AI 方面投入了大量資金,Elasticsearch 是下載次數(shù)最多的向量數(shù)據(jù)庫! 最好的入門方式是 Elastic Search Labs。它包含適用于 elasticsearch-py 8.x 的每個用例的博客文章和 Python 筆記本。
就是這樣! 謝謝閱讀。 當你準備好升級時,遷移指南是最好的起點。文章來源:http://www.zghlxwxcb.cn/news/detail-804800.html
Migrating to 8.0 | Elasticsearch Python Client [8.11] | Elastic
到了這里,關于Elasticsearch:升級到 elasticsearch-py 8.x 的 10 個理由的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!