作者:來自 Elastic?Miguel Grinberg
學習如何使用 ES|QL 查詢構建器,這是一個新的 Python Elasticsearch client 功能,可以更輕松地使用熟悉的 Python 語法構建 ES|QL 查詢。
想要獲得 Elastic 認證嗎?快來了解下一期 Elasticsearch Engineer 培訓什么時候開始!
Elasticsearch 擁有大量新功能,可以幫助你根據使用場景構建最佳搜索解決方案。深入學習我們的示例筆記本,了解更多內容,開始免費云試用,或者立即在本地機器上嘗試 Elastic。
我們很高興地宣布 Python Elasticsearch client 的新 ES|QL 查詢構建器模塊。有了它,你可以使用熟悉的 Python 語法為 ES|QL 引擎構建查詢。
介紹
ES|QL 是一種專門為數據分析設計的查詢語言。新的 Python 查詢構建器讓你可以在 Python 應用中輕松構建和運行 ES|QL 查詢。
查詢構建器功能在當前版本的 Python Elasticsearch client 中已經可用,從 8.19 版本開始。這個包叫做 elasticsearch,可以用你喜歡的 Python 安裝工具安裝。例如,下面是使用 pip 安裝的方法:
pip install elasticsearch
如果你的應用使用的 Python Elasticsearch client 版本低于 8.19,那么你需要升級它才能使用查詢構建器。
在 Python 中創建 ES|QL 查詢
下面的示例使用 Python 查詢構建器創建一個 ES|QL 查詢對象:
from elasticsearch.esql import ESQLquery = (ESQL.from_("employees").keep("first_name", "last_name", "height").eval(height_feet="height * 3.281",height_cm="height * 100",).sort("date_hired DESC").limit(3)
)
當打印或轉換為字符串時,該對象會生成一個標準的 ES|QL 查詢:
>>> print(query)
FROM employees
| KEEP first_name, last_name, height
| EVAL height_feet = height * 3.281, height_cm = height * 100
| SORT date_hired DESC
| LIMIT 3
你可以將 query 對象直接傳遞給 Python Elasticsearch client 的 ES|QL 端點來執行查詢:
from elasticsearch import Elasticsearch
client = Elasticsearch(hosts=[os.environ['ELASTICSEARCH_URL']])
response = client.esql.query(query=str(query))
響應對象包含所有返回列的描述以及結果行:
>>> from pprint import pprint
>>> pprint(response.body)
{'columns': [{'name': 'first_name', 'type': 'text'},{'name': 'last_name', 'type': 'text'},{'name': 'height', 'type': 'double'},{'name': 'height_feet', 'type': 'double'},{'name': 'height_cm', 'type': 'double'}],'is_partial': False,'took': 11,'values': [['Adrian', 'Wells', 2.424, 7.953144, 242.4],['Aaron', 'Gonzalez', 1.584, 5.1971, 158.4],['Miranda', 'Kramer', 1.55, 5.08555, 155]]}
Python ES|QL 模塊包含所有 ES|QL 命令、函數和操作符的 Python 封裝。下一個示例展示了一個使用 LENGTH 函數和條件子句的更高級查詢:
from elasticsearch.esql import ESQL, functionsquery = (ESQL.from_("employees").keep("first_name", "last_name", "height").where(functions.length(E("first_name")) < 4)
)
這是生成的 ES|QL 查詢:
>>> print(query)
FROM employees
| KEEP first_name, last_name, height
| WHERE LENGTH(first_name) < 4
想嘗試這個功能嗎?可以查看 Python Elasticsearch client 文檔中關于創建 ES|QL 查詢的內容以獲取更多信息。
使用 DSL 模塊的 ES|QL 查詢
ES|QL 查詢構建器也集成在 Python Elasticsearch client 的 DSL 模塊中。所有文檔類都包含 esql_from() 便捷方法來創建基本的 ES|QL 查詢。例如,假設已定義 Employee 文檔類,可以創建一個查詢以返回所有員工(默認情況下 ES|QL 允許的最大結果數為 1000),如下所示:
query = Employee.esql_from()
這個查詢對象可以根據需要與額外的 ES|QL 命令鏈式調用。為了減少查詢出錯的可能,每當需要引用字段時,可以使用文檔類的類屬性,而不是使用字符串:
query = (Employee.esql_from().where(functions.length(Employee.first_name) < 4).sort(Employee.date_hired.desc()).limit(100)
)
如果需要,該查詢可以像上面一樣進行評估,但文檔類提供了 esql_execute() 方法,該方法使用 DSL 模塊的管理連接運行查詢。此方法還會將原始結果轉換為返回文檔實例的迭代器:
for emp in Employee.esql_execute(query):print(f"{emp.first_name} {emp.last_name} is {emp.height:.2f}m tall")
如果你想了解更多關于 ES|QL 查詢構建器與 DSL 模塊集成的信息,可以查看我們的 Elastic 文檔。
結論
我們希望你在下次需要在 Python 應用中使用 ES|QL 時嘗試新的 ES|QL 查詢構建器。請注意,該功能目前以技術預覽形式發布。如果你有任何問題、反饋或遇到問題,請在 GitHub 上的 Python Elasticsearch client 倉庫中創建一個 issue。
原文:https://www.elastic.co/search-labs/blog/esql-query-builder-python-elasticsearch-client