日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

用 Python 優(yōu)雅地玩轉(zhuǎn) Elasticsearch:實(shí)用技巧與最佳實(shí)踐

來源: 責(zé)編: 時(shí)間:2024-03-18 09:42:26 181觀看
導(dǎo)讀Elasticsearch,這個(gè)開源的分布式搜索與數(shù)據(jù)分析引擎,因其強(qiáng)大的全文搜索功能而廣受歡迎。盡管Elasticsearch的核心是用Java編寫的,它提供了REST API,讓各種編程語言的開發(fā)者都能輕松與之交互,Python當(dāng)然也不例外。今天,我們

Elasticsearch,這個(gè)開源的分布式搜索與數(shù)據(jù)分析引擎,因其強(qiáng)大的全文搜索功能而廣受歡迎。jcs28資訊網(wǎng)——每日最新資訊28at.com

盡管Elasticsearch的核心是用Java編寫的,它提供了REST API,讓各種編程語言的開發(fā)者都能輕松與之交互,Python當(dāng)然也不例外。jcs28資訊網(wǎng)——每日最新資訊28at.com

今天,我們將深入探討如何將 Elasticsearch 與 Python 結(jié)合使用,提升我們的項(xiàng)目到新的高度。jcs28資訊網(wǎng)——每日最新資訊28at.com

jcs28資訊網(wǎng)——每日最新資訊28at.com

圖片jcs28資訊網(wǎng)——每日最新資訊28at.com

1、入門準(zhǔn)備

首先,確保我們有一個(gè)運(yùn)行中的 Elasticsearch 8.X 實(shí)例、Kibana實(shí)例。jcs28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jcs28資訊網(wǎng)——每日最新資訊28at.com

2、Elasticsearch Python 客戶端介紹

在Python項(xiàng)目中,我們可以選擇以下幾個(gè)庫與Elasticsearch交互:jcs28資訊網(wǎng)——每日最新資訊28at.com

elasticsearch-py:官方提供的低級(jí)客戶端(Official low-level client for Elasticsearch),直接且靈活。jcs28資訊網(wǎng)——每日最新資訊28at.com

https://elasticsearch-py.readthedocs.io/en/v8.12.1/jcs28資訊網(wǎng)——每日最新資訊28at.com

elasticsearch-dsl:基于 elasticsearch-py 的高級(jí)封裝,簡化了很多操作,更適合日常使用。jcs28資訊網(wǎng)——每日最新資訊28at.com

https://elasticsearch-dsl.readthedocs.io/en/latest/jcs28資訊網(wǎng)——每日最新資訊28at.com

django-elasticsearch-dsl:為 Django 用戶設(shè)計(jì),基于elasticsearch-dsl,實(shí)現(xiàn)了與Django的深度集成。jcs28資訊網(wǎng)——每日最新資訊28at.com

https://django-elasticsearch-dsl.readthedocs.io/en/latest/jcs28資訊網(wǎng)——每日最新資訊28at.com

3、Elasticsearch Python 客戶端適用場景及優(yōu)缺點(diǎn)

客戶端jcs28資訊網(wǎng)——每日最新資訊28at.com

應(yīng)用場景jcs28資訊網(wǎng)——每日最新資訊28at.com

優(yōu)點(diǎn)jcs28資訊網(wǎng)——每日最新資訊28at.com

缺點(diǎn)jcs28資訊網(wǎng)——每日最新資訊28at.com

elasticsearch-pyjcs28資訊網(wǎng)——每日最新資訊28at.com

直接與Elasticsearch交互的底層操作jcs28資訊網(wǎng)——每日最新資訊28at.com

- 完整訪問Elasticsearch API
- 靈活性高jcs28資訊網(wǎng)——每日最新資訊28at.com

- 代碼復(fù)雜,易出錯(cuò)
- 需要深入理解ES的查詢DSLjcs28資訊網(wǎng)——每日最新資訊28at.com

elasticsearch-dsljcs28資訊網(wǎng)——每日最新資訊28at.com

構(gòu)建復(fù)雜搜索查詢jcs28資訊網(wǎng)——每日最新資訊28at.com

- 簡化查詢構(gòu)建
- 更Pythonic的接口
- 減少語法錯(cuò)誤的風(fēng)險(xiǎn)jcs28資訊網(wǎng)——每日最新資訊28at.com

- 學(xué)習(xí)成本相對較高jcs28資訊網(wǎng)——每日最新資訊28at.com

django-elasticsearch-dsljcs28資訊網(wǎng)——每日最新資訊28at.com

在Django項(xiàng)目中使用Elasticsearchjcs28資訊網(wǎng)——每日最新資訊28at.com

- 與Django無縫集成
- 自動(dòng)同步Django模型與Elasticsearch文檔jcs28資訊網(wǎng)——每日最新資訊28at.com

- 限定于Django項(xiàng)目
- 相比直接使用elasticsearch-py有更多抽象jcs28資訊網(wǎng)——每日最新資訊28at.com

4、使用 elasticsearch-py 進(jìn)行增刪改查基礎(chǔ)操作

elasticsearch-py 是Elasticsearch的官方低級(jí)Python客戶端。jcs28資訊網(wǎng)——每日最新資訊28at.com

它允許我們執(zhí)行所有基本和高級(jí)的Elasticsearch操作,包括直接與集群交互、管理索引、執(zhí)行CRUD(創(chuàng)建、讀取、更新、刪除)操作以及搜索。jcs28資訊網(wǎng)——每日最新資訊28at.com

以下是使用elasticsearch-py的一些基礎(chǔ)操作示例:jcs28資訊網(wǎng)——每日最新資訊28at.com

4.1 導(dǎo)入依賴

導(dǎo)入必要的Python庫,包括datetime、Elasticsearch、configparser,并配置警告過濾以忽略警告信息。jcs28資訊網(wǎng)——每日最新資訊28at.com

from elasticsearch import Elasticsearchimport configparserimport warningswarnings.filterwarnings("ignore")

4.2 初始化Elasticsearch客戶端

init_es_client函數(shù)從配置文件config.ini讀取Elasticsearch的配置(如主機(jī)地址、用戶名和密碼),并初始化Elasticsearch客戶端。這允許與Elasticsearch集群建立連接。jcs28資訊網(wǎng)——每日最新資訊28at.com

def init_es_client(config_path='./conf/config.ini'):    """初始化并返回Elasticsearch客戶端"""    # 初始化配置解析器    config = configparser.ConfigParser()    # 讀取配置文件    config.read(config_path)    # 從配置文件中獲取Elasticsearch配置    es_host = config.get('elasticsearch', 'ES_HOST')    es_user = config.get('elasticsearch', 'ES_USER')    es_password = config.get('elasticsearch', 'ES_PASSWORD')    es = Elasticsearch(        hosts=[es_host],        basic_auth=(es_user, es_password),        verify_certs=False,        ca_certs='conf/http_ca.crt'    )    return esbasic_auth=(es_user, es_password)

Elasticsearch 8.X要求客戶端連接時(shí)進(jìn)行身份驗(yàn)證。這里使用基本認(rèn)證(HTTP Basic Authentication)提供用戶名和密碼。這兩個(gè)值應(yīng)該對應(yīng)于有效的Elasticsearch用戶憑證,該用戶需要有足夠的權(quán)限執(zhí)行客戶端請求的操作。jcs28資訊網(wǎng)——每日最新資訊28at.com

verify_certs=False

這個(gè)選項(xiàng)告訴客戶端是否驗(yàn)證Elasticsearch服務(wù)器的TLS證書。在生產(chǎn)環(huán)境中,我們應(yīng)該將其設(shè)置為True以確保安全的通信。將此設(shè)置為False可能會(huì)導(dǎo)致中間人攻擊等安全風(fēng)險(xiǎn)。在開發(fā)或測試環(huán)境中,如果使用的是自簽名證書,可能需要暫時(shí)設(shè)置為False來避免驗(yàn)證錯(cuò)誤。jcs28資訊網(wǎng)——每日最新資訊28at.com

ca_certs='conf/http_ca.crt'

當(dāng)verify_certs=True時(shí),這里指定了CA證書的路徑,客戶端將使用它來驗(yàn)證服務(wù)器證書的簽名。這是實(shí)現(xiàn)TLS加密通信的關(guān)鍵部分。在Elasticsearch 8.X中,如果啟用了安全特性(默認(rèn)情況下啟用),那么客戶端需要信任連接到的Elasticsearch服務(wù)器使用的CA。如果Elasticsearch使用的是自簽名證書或私有CA簽發(fā)的證書,那么我們需要在客戶端提供CA證書的路徑。jcs28資訊網(wǎng)——每日最新資訊28at.com

對于Elasticsearch 8.X版本,正確配置客戶端以安全地連接到Elasticsearch服務(wù)是非常重要的。這包括使用HTTPS協(xié)議、提供正確的用戶認(rèn)證憑證,以及在啟用了TLS加密通信時(shí)驗(yàn)證服務(wù)器證書。為了最大化安全性和兼容性,強(qiáng)烈推薦在生產(chǎn)環(huán)境中使用由受信任CA簽發(fā)的證書,并且始終驗(yàn)證服務(wù)器證書。jcs28資訊網(wǎng)——每日最新資訊28at.com

4.3 創(chuàng)建索引

create_index函數(shù)嘗試創(chuàng)建一個(gè)新索引。如果指定的索引名已存在,則忽略創(chuàng)建操作。索引是數(shù)據(jù)存儲(chǔ)和搜索的基本單位。jcs28資訊網(wǎng)——每日最新資訊28at.com

def create_index(es, index_name="test-index"):    """創(chuàng)建索引,如果索引已存在則忽略"""    if not es.indices.exists(index=index_name):        es.indices.create(index=index_name)

4.4 定義映射

define_mapping函數(shù)為索引設(shè)置映射。映射定義了索引中文檔的字段類型,如文本、整數(shù)和關(guān)鍵詞等。這有助于Elasticsearch理解字段內(nèi)容并優(yōu)化搜索和聚合操作。jcs28資訊網(wǎng)——每日最新資訊28at.com

def define_mapping(es, index_name="test-index"):    """為索引定義映射"""    mapping = {        "mappings": {            "properties": {                "name": {"type": "text"},                "age": {"type": "integer"},                "email": {"type": "keyword"}            }        }    }    es.indices.create(index=index_name, body=mapping, ignore=400)  # ignore=400忽略索引已存在錯(cuò)誤

4.5 插入文檔

insert_document函數(shù)向指定索引插入(或更新)一個(gè)文檔。文檔由一個(gè)Python字典表示,可以包含多個(gè)字段和值。如果提供了doc_id,該ID將用于文檔;否則,Elasticsearch會(huì)自動(dòng)生成一個(gè)ID。jcs28資訊網(wǎng)——每日最新資訊28at.com

def insert_document(es, index_name="test-index", doc_id=None, document=None):    """插入文檔到指定索引"""    es.index(index=index_name, id=doc_id, document=document)

4.6 更新文檔

update_document函數(shù)更新指定索引中的特定文檔。需要文檔的ID和要更新的字段。jcs28資訊網(wǎng)——每日最新資訊28at.com

def update_document(es, index_name="test-index", doc_id=None, updated_doc=None):    """更新指定ID的文檔"""    es.update(index=index_name, id=doc_id, body={"doc": updated_doc})

4.7 刪除文檔

delete_document函數(shù)從指定索引中刪除特定ID的文檔。jcs28資訊網(wǎng)——每日最新資訊28at.com

def delete_document(es, index_name="test-index", doc_id=None):    """刪除指定ID的文檔"""    es.delete(index=index_name, id=doc_id)

4.8 搜索文檔

search_documents 函數(shù)在指定索引中執(zhí)行搜索查詢,并返回匹配的文檔。查詢通過一個(gè)查詢DSL(Domain-Specific Language)構(gòu)建,可以非常靈活地定義搜索條件。jcs28資訊網(wǎng)——每日最新資訊28at.com

def search_documents(es, index_name="test-index", query=None):    """在指定索引中搜索文檔"""    return es.search(index=index_name, body=query)

4.9 main函數(shù)

main函數(shù)是程序的入口點(diǎn),按順序執(zhí)行了創(chuàng)建索引、定義映射、插入文檔、更新文檔、搜索文檔和刪除文檔的操作,演示了與Elasticsearch交互的完整流程。jcs28資訊網(wǎng)——每日最新資訊28at.com

def main():    # 初始化Elasticsearch客戶端    es = init_es_client()    # 創(chuàng)建索引    create_index(es)    # 定義映射    define_mapping(es)    # 插入文檔    doc = {        "name": "John Doe",        "age": 30,        "email": "john.doe@example.com"    }    insert_document(es, doc_id="1", document=doc)    # 更新文檔    # 注意:這里假設(shè)我們知道文檔的ID。實(shí)際使用時(shí)可能需要通過搜索等方式來確定ID    update_document(es, doc_id="1", updated_doc={"age": 31})    # 搜索文檔    query = {        "query": {            "match": {                "name": "John Doe"            }        }    }    search_result = search_documents( es, query=query )    print( search_result )    # 刪除文檔    delete_document(es, doc_id="1")

以上示例展示了使用elasticsearch-py進(jìn)行基本的Elasticsearch操作。jcs28資訊網(wǎng)——每日最新資訊28at.com

這些操作涵蓋了創(chuàng)建和刪除索引、定義映射、插入、更新和刪除文檔以及基本的搜索功能。jcs28資訊網(wǎng)——每日最新資訊28at.com

elasticsearch-py提供了訪問Elasticsearch強(qiáng)大功能的直接途徑,但正如之前討論的,使用它需要對Elasticsearch的工作原理有深入理解。jcs28資訊網(wǎng)——每日最新資訊28at.com

5、使用 elasticsearch-dsl 進(jìn)行基礎(chǔ)操作

如下代碼演示了如何使用elasticsearch-dsl,一個(gè)Python庫,以便與Elasticsearch進(jìn)行高效交互。jcs28資訊網(wǎng)——每日最新資訊28at.com

我們將涵蓋初始化客戶端、創(chuàng)建索引、文檔的CRUD操作以及執(zhí)行搜索查詢。jcs28資訊網(wǎng)——每日最新資訊28at.com

5.1 初始化 Elasticsearch 客戶端

為了與Elasticsearch集群交互,首先需要建立連接。我們通過讀取配置文件來獲取連接信息,并創(chuàng)建一個(gè)默認(rèn)連接。jcs28資訊網(wǎng)——每日最新資訊28at.com

def init_es_client_dsl(config_path='./conf/config.ini'):    config = configparser.ConfigParser()    config.read(config_path)    es_host = config.get('elasticsearch', 'ES_HOST')    es_user = config.get('elasticsearch', 'ES_USER')    es_password = config.get('elasticsearch', 'ES_PASSWORD')    connections.create_connection(        hosts=[es_host],        http_auth=(es_user, es_password),        verify_certs=False    )

5.2 創(chuàng)建索引

在Elasticsearch中,索引是存儲(chǔ)文檔的容器。我們定義了一個(gè)文檔類 MyDocument,指定了索引名稱和映射,并刪除已存在的同名索引后重新創(chuàng)建。jcs28資訊網(wǎng)——每日最新資訊28at.com

class MyDocument(Document):    name = Text()    age = Integer()    email = Text()    class Index:        name = 'test-index'        settings = { "number_of_shards": 1, }def create_index_dsl():    es = connections.get_connection()    es.indices.delete(index='test-index', ignore=[400, 404])    MyDocument.init()

5.3 插入文檔

將一個(gè)新文檔插入到Elasticsearch。如果提供了id,將使用它作為文檔ID;否則,Elasticsearch會(huì)自動(dòng)生成一個(gè)。jcs28資訊網(wǎng)——每日最新資訊28at.com

def insert_document_dsl(document):    doc = MyDocument(meta={'id': document.get('id', None)}, **document)    doc.save()

5.4 更新文檔

根據(jù)文檔ID更新已存在的文檔。這里我們更新了文檔的某些字段。jcs28資訊網(wǎng)——每日最新資訊28at.com

def update_document_dsl(doc_id, updated_doc):    doc = MyDocument.get(id=doc_id)    for key, value in updated_doc.items():        setattr(doc, key, value)    doc.save()

5.5 刪除文檔

根據(jù)ID刪除指定的文檔。jcs28資訊網(wǎng)——每日最新資訊28at.com

def delete_document_dsl(doc_id):    doc = MyDocument.get(id=doc_id)    doc.delete()

5.6 搜索文檔

執(zhí)行一個(gè)搜索查詢,返回匹配指定查詢條件的文檔。在此例中,我們使用match查詢匹配名字字段。jcs28資訊網(wǎng)——每日最新資訊28at.com

def search_documents_dsl(query):    es = connections.get_connection()    es.indices.refresh(index="test-index")    s = Search(index="test-index").query("match", name=query)    response = s.execute()    return response

5.7 主函數(shù)

main_ds l函數(shù)串聯(lián)了上述所有步驟,展示了如何在實(shí)際應(yīng)用中使用這些功能。jcs28資訊網(wǎng)——每日最新資訊28at.com

def main_dsl():    init_es_client_dsl()    create_index_dsl()    insert_document_dsl({ ... })    results = search_documents_dsl('John Doe')    update_document_dsl('1', { ... })    delete_document_dsl('1')

5.8 運(yùn)行

將上述代碼保存為Python文件并執(zhí)行,可以看到從插入到搜索、更新和刪除文檔的完整流程。jcs28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片jcs28資訊網(wǎng)——每日最新資訊28at.com

5.9 特別強(qiáng)調(diào)——默認(rèn)連接池管理

在elasticsearch-dsl中,當(dāng)我們創(chuàng)建查詢或者執(zhí)行任何需要與Elasticsearch服務(wù)器通信的操作時(shí),并不需要每次都顯式地指定Elasticsearch連接實(shí)例。jcs28資訊網(wǎng)——每日最新資訊28at.com

這是因?yàn)閑lasticsearch-dsl內(nèi)部維護(hù)了一個(gè)默認(rèn)的連接池。當(dāng)我們首次使用connections.create_connection函數(shù)創(chuàng)建連接時(shí),如果不指定別名,這個(gè)連接就被設(shè)置為默認(rèn)連接。jcs28資訊網(wǎng)——每日最新資訊28at.com

官方alias 示例:jcs28資訊網(wǎng)——每日最新資訊28at.com

from elasticsearch_dsl import connectionsconnections.create_connection(alias='my_new_connection', hosts=['localhost'], timeout=60)

后續(xù)的所有操作,如搜索查詢,都會(huì)自動(dòng)使用這個(gè)默認(rèn)連接,除非咱們通過using參數(shù)顯式指定了另一個(gè)連接。jcs28資訊網(wǎng)——每日最新資訊28at.com

這種設(shè)計(jì)使得在大多數(shù)情況下,我們只需在應(yīng)用啟動(dòng)時(shí)建立一次連接,而不需要在每個(gè)查詢中重復(fù)指定連接信息,從而簡化了代碼并提高了代碼的可讀性和維護(hù)性。jcs28資訊網(wǎng)——每日最新資訊28at.com

參見:jcs28資訊網(wǎng)——每日最新資訊28at.com

https://elasticsearch-dsl.readthedocs.io/en/latest/configuration.html#default-connectionjcs28資訊網(wǎng)——每日最新資訊28at.com

6、小結(jié)

篇幅原因,django-elasticsearch-dsl API 沒有展開。如果需要,歡迎留言討論。jcs28資訊網(wǎng)——每日最新資訊28at.com

在本文中,我們探討了如何將Elasticsearch與Python結(jié)合使用,通過兩種主要的Python客戶端——elasticsearch-py和elasticsearch-dsl。jcs28資訊網(wǎng)——每日最新資訊28at.com

elasticsearch-py提供了直接且靈活的底層API訪問,適用于需要完整控制Elasticsearch交互細(xì)節(jié)的場景。jcs28資訊網(wǎng)——每日最新資訊28at.com

相比之下,elasticsearch-dsl提供了更高級(jí)的抽象,通過更為Pythonic的接口簡化了復(fù)雜搜索查詢的構(gòu)建,使得代碼更加簡潔易讀,尤其適合日常使用和復(fù)雜查詢構(gòu)建。jcs28資訊網(wǎng)——每日最新資訊28at.com

此外,我們還介紹了如何通過elasticsearch-dsl內(nèi)部管理的默認(rèn)連接池來簡化連接管理,避免了在每次查詢時(shí)重復(fù)指定連接信息,從而提高了開發(fā)效率和代碼的可維護(hù)性。通過這種方式,開發(fā)者只需在應(yīng)用啟動(dòng)時(shí)配置一次連接,之后便可以在整個(gè)應(yīng)用中復(fù)用這個(gè)默認(rèn)連接。jcs28資訊網(wǎng)——每日最新資訊28at.com

無論是直接使用elasticsearch-py進(jìn)行底層操作,還是利用elasticsearch-dsl進(jìn)行更加高效的數(shù)據(jù)處理和搜索,Elasticsearch都能為Python開發(fā)者提供強(qiáng)大的搜索和數(shù)據(jù)分析能力,幫助他們輕松應(yīng)對各種數(shù)據(jù)處理和搜索需求,將項(xiàng)目提升到新的高度。在選擇合適的客戶端和API時(shí),重要的是根據(jù)項(xiàng)目的具體需求和團(tuán)隊(duì)的熟悉程度來做出決策,以確保既能充分發(fā)揮Elasticsearch的強(qiáng)大功能,又能保持代碼的可讀性和可維護(hù)性。jcs28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-76542-0.html用 Python 優(yōu)雅地玩轉(zhuǎn) Elasticsearch:實(shí)用技巧與最佳實(shí)踐

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Sharding-JDBC源碼解析與vivo的定制開發(fā)

下一篇: 實(shí)現(xiàn)一個(gè)刷數(shù)任務(wù),需要思考哪些維度?

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 屏东县| 定南县| 乌什县| 阿坝| 蓬溪县| 苍梧县| 荔波县| 武定县| 马山县| 镇赉县| 青神县| 抚宁县| 广南县| 甘谷县| 景德镇市| 凉山| 苏尼特左旗| 额尔古纳市| 筠连县| 灵台县| 乐东| 塔河县| 弋阳县| 来凤县| 双峰县| 施甸县| 天祝| 丰镇市| 东山县| 浦城县| 屏边| 庆城县| 奉化市| 武清区| 巩留县| 郸城县| 雷州市| 霸州市| 隆昌县| 鄂温| 新邵县|