歡迎光臨
每天分享高質量文章

在Python中使用Elasticsearch

來源:Python程式員

ID:pythonbuluo

在這篇文章中,我將討論Elasticsearch以及如何將其整合到不同的Python應用程式中。

什麼是ElasticSearch?

ElasticSearch(ES)是一個建立在Apache Lucene之上的高度可用的分散式開源搜尋引擎。它基於Java構建的,因此可用於許多平臺。資料以JSON格式非結構化儲存,這也使其成為一種NoSQL資料庫。與其他NoSQL資料庫不同,ES還提供搜尋引擎功能和其他相關功能。

ElasticSearch用例

ES可用於多種目的,下麵給出了其中的幾個:

  • 你運營著提供大量動態內容的網站,比如電子商務網站或者部落格。透過實施ES,你不僅可以為Web應用程式提供強大的搜尋引擎,還可以在應用程式中提供原生自動補全功能。

  • 你可以獲取不同型別的日誌資料,然後可以使用它來查詢趨勢和統計資訊。

設定和執行

安裝ElasticSearch最簡單的方法就是下載並執行可執行檔案。必須確保使用的是Java 7或更高版本。

下載後解壓縮並執行它的二進位制檔案。

滾動視窗中會出現很多文字。如果你看到像下麵這樣的,那麼它應該是完成了。

但是,由於眼見為實,可以在瀏覽器中訪問URLhttp://localhost:9200或者透過cURL 檢視類似於這樣的歡迎介面以便你知道確實成功安裝了:

在我開始訪問Python中的Elastic Search之前,我們來做一些基本的東西。 正如我提到ES提供了一個REST API介面,我們將使用它來執行不同的任務。

基本示例

你要做的第一件事就是建立索引。一切都以索引形式儲存。RDBMS概念中索引相當於一個資料庫,因此不要將它與你在RDBMS中學習的典型索引概念混淆。使用PostMan來執行REST API。

如果它成功執行,你會看到如下所示的回應:

所以我們使用company為名建立了一個資料庫。換句話說,我們建立了一個名為“company”的索引。如果你從瀏覽器訪問http://localhost:9200/company,那麼你將看到如下所示的內容:

暫時不用管mappings是什麼,我們會在後面討論它。它實際上做的只是建立一個你自己的Schema檔案。creation_date是不言自明的。number_of_shards表示將保留此索引資料的分割槽數量。將整個資料儲存在單個磁碟上毫無意義。如果你執行的是多個Elastic節點的叢集,那麼整個資料都會被分割。簡而言之,如果有5個分片,則整個資料可以在5個分片中使用,並且ElasticSearch叢集可以服務來自其任何節點的請求。

副本討論的是你的資料的映象。如果你熟悉主從概念,那麼這對你來說不應該是新事物。你可以瞭解更多關於基本ES概念。

建立索引的cURL版本是單執行緒的。

你也可以一次執行索引建立和記錄插入任務。你所要做的就是以JSON格式傳遞你的記錄。你可以在PostMan中使用下麵的東西:

請確保你將Content-Type設定為application/json.

一個名為company的索引會被建立如果它原本不存在的話,然後在這裡建立一個名為employees的新型別。Type實際上是RDBMS中的表的ES版本。

上述請求將輸出以下JSON結構:

你傳遞/1作為你的記錄的ID,但這是不必要的。它所做的只是將_id欄位設定為值1,然後資料以JSON格式傳遞,最終作為新記錄或檔案插入。如果你從瀏覽器訪問http://localhost:9200/company/employees/1,你會看到如下所示的內容:

你可以看到元和實際記錄。 如果你想,可以將請求更改為http://localhost:9200/company/employees/1/_source,那麼就會僅輸出JSON結構記錄。

cURL版本將是:

如果你想更新該記錄怎麼辦?這很簡單。你所要做的就是改變你的JSON記錄。如下所示:

它會生成以下輸出:

註意現在_result欄位設定為updated而不是created。

當然,你也可以刪除某些記錄。

如果你瘋了,或者你的女朋友甩了你,你可以透過從命令列執行curl -XDELETE localhost:9200/_all來毀掉整個世界。

讓我們做一些基本的搜尋。 如果執行http://localhost:9200/company/employees/_search?q=adnan,它將搜尋employees型別下的所有欄位並傳回相關記錄。

max_score欄位表示記錄的相關性,即記錄的最高分數。如果有多個記錄,那麼它會是一個不同的數字。

你還可以透過傳遞欄位名稱將搜尋條件限制到某個欄位。因此,http://localhost:9200/company/employees/_search?q=name:Adnan將僅在檔案的名稱欄位中進行搜尋。它實際上等同於SQL中的SELECT * from table where name=”Adnan”。

我剛剛介紹了基本的例子。ES可以做很多事情,但是希望你自己透過閱讀檔案來進一步探索它,而我將繼續介紹在Python中使用ES。

在Python中使用ElasticSearch

說實話,ES的REST API已經足夠好了,可以讓你使用requests庫執行所有任務。不過,你可以使用ElasticSearch的Python庫專註於主要任務,而不必擔心如何建立請求。

透過pip安裝它,然後你可以在你的Python程式中訪問它。

為確保它的安裝正確,請從命令列執行以下基本片段:

網頁搜尋和Elasticsearch

我們來討論一下使用Elasticsearch的一些實際用例。我們的標的是訪問線上食譜並將它們儲存在Elasticsearch中以用於搜尋和分析。我們將首先從Allrecipes中獲取資料並將其儲存在ES中。我們還將建立一個嚴格的樣式或對映,以便我們確保資料以正確的格式和型別進行索引。最後只要列出沙拉食譜的清單。我們開始吧!

獲取資料

所以這是獲取資料的基本程式。因為我們需要JSON格式的資料,所以我對其進行了相應的轉換。

建立索引

我們得到了所需的資料,接下來我們必須儲存它。我們要做的第一件事就是建立一個索引。讓我們將其命名為recipes。 該型別將被稱為salads。我要做的另一件事是建立我們的檔案結構的對映。

在我們建立索引之前,我們必須連線ElasticSearch伺服器。

_es.ping()會ping伺服器,併在連線後傳回True。我花了一段時間才弄清楚如何捕獲堆疊跟蹤,發現它只是被記錄下來!

這裡有很多要說的事。首先,我們傳遞了一個包含整個檔案結構對映的配置變數。對映是樣式這一術語在Elastic的版本。就像我們在表格中設定特定的欄位資料型別一樣,我們在這裡做類似的事情。檢查檔案,它涵蓋的不僅僅是這些。所有欄位都是文字型別,但是calories型別為Integer。

接下來,我確保索引不存在,然後建立它。引數ignore = 400在檢查後不再需要,但存在性證明是必要的,因為這可以防止錯誤地改寫現有索引。雖然這很危險。這就像改寫資料庫。

如果索引成功建立,你可以透過訪問http://localhost:9200/recipes/_mappings來驗證它,它會輸出如下所示的內容:

透過傳遞dynamic:strict我們使Elasticsearch嚴格檢查任何傳入的檔案。在這裡,salads實際上是檔案型別。Type實際上是Elasticsearch對RDBMS表的回答。

記錄索引

下一步是儲存實際的資料或檔案。

執行它,你會看到:

你能猜到為什麼會這樣嗎?由於我們沒有在我們的對映中設定ingredients,因此ES不允許我們儲存包含ingredients欄位的檔案。現在你知道事先分配對映的優勢了。你可以透過這樣做避免破壞資料。現在,讓我們稍微修改一下對映,現在看起來如下所示:

我們新增nested型別的ingrdients,然後分配內部欄位的資料型別,即在我們的案例中的text。

nested資料型別允許設定巢狀的JSON物件的型別。再次執行它,你將看到以下輸出:

由於你根本沒有傳遞_id,因此ES本身為儲存的檔案分配了一個動態ID。 我使用Chrome,藉助名為ElasticSearch Toolbox的工具使用ES資料檢視器來檢視資料。

在我們繼續之前,讓我們在calories欄位中傳送一個字串,看看它是如何發生的。請記住,我們已將其設定為整數。 在編製索引時出現以下錯誤:

所以現在你知道為檔案分配一個對映的好處了。如果你不這樣做,它仍然會工作,因為Elasticsearch將在執行時分配它自己的對映。

查詢記錄

現在,記錄被編入索引,是時候根據我們的需要查詢它們了。我將建立一個名為search()的函式,它將顯示我們的查詢結果。

這是非常基本的。 你在其中傳遞索引和搜尋條件。讓我們嘗試一些查詢。

上述查詢將傳回卡路里等於102的所有記錄。在我們的情況下,輸出將是:

如果你想獲得卡路里超過20的記錄怎麼辦?

你也可以指定想要傳回的列或欄位。上述查詢將傳回卡路里大於20的所有記錄。此外,它將僅在_source下顯示title欄位。

結論

Elasticsearch是一個功能強大的工具,它可以提供強大的功能幫助你來傳回最準確的結果集,從而使你現有的或新的應用程式可搜尋。我剛剛講述了它的要點,你可以繼續閱讀檔案並熟悉這個強大的工具。尤其是模糊搜尋功能非常棒。如果我有機會,我會在即將釋出的帖子中介紹Query DSL。

英文原文:http://blog.adnansiddiqi.me/getting-started-with-elasticsearch-in-python/
譯者:β

《Python人工智慧和全棧開發》2018年07月23日即將在北京開課,120天衝擊Python年薪30萬,改變速約~~~~

*宣告:推送內容及圖片來源於網路,部分內容會有所改動,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜。

– END –


更多Python好文請點選【閱讀原文】哦

↓↓↓

贊(0)

分享創造快樂