在本文中,我們將介紹Elasticsearch的基礎知識: 它是什麼,如何運行它,如何與它進行通信。
然後,在我們熟悉了Elasticsearch之後,我們將開始使用Django開發一個簡單的web應用程序,它將使用Elasticsearch的強大功能。
運行Elasticsearch
在深入研究Elasticsearch的概念之前,我們應該先運行它。
當你開始在網上閱讀關於Elasticsearch的文章時,你一定會偶然發現Elastic Stack這個詞。Elastic Stack是由不同工具組成的生態系統:Kibana、Logstash、Beats和Elasticsearch本身。在本文中,我們將只使用Elasticsearch。
運行Elasticsearch最簡單的方法是使用Docker。你只需要從DockerHub中獲取一個鏡像,並運行該容器,它就可以工作了:
如果你正確地執行了所有操作,你應該就可以向Elasticsearch發送HTTP請求:
我已經在這裡使用了httpie庫,以後還將使用它來發送HTTP請求。你可以使用httpie、curl或任何其他客戶端來發送請求。這取決於你。
Elasticsearch 基本操作
Elasticsearch是一個搜索引擎。你應該考慮使用Elasticsearch來搜索數據,而不是使用像PostgreSQL或MySQL這樣的常規SQL數據庫的原因如下:
- 它運行的相當快;
- 它可以規模化;
- 它有很多很酷的組件,比如用於可視化數據的Kibana、用於收集和轉換數據的Logstash等等。
與Elasticsearch的通信是通過RESTful API實現的。因此,所有操作都可以通過HTTP進行。如果你以前已經使用過RESTful API,那麼通信對你來說應該很順暢。
Elasticsearch是NoSQL數據庫。它將數據存儲為JSON文檔,並且不會對數據施加嚴格的結構,這意味著你可以在JSON文檔中放入任何你想要的內容。
這些JSON文檔是在類型和索引中進行組織的。每個文檔都屬於一個類型。類型本身存在於索引中。每個索引只能包含一個類型。
我們可以將Elasticsearch存儲數據的方式與其他關係型數據庫存儲數據的方式進行對比:
關係型數據庫 → 數據庫 → 表 → 行 → 列
Elasticsearch →索引 → 類型 → 文檔 →字段
惟一的區別是在關係型數據庫中,每個數據庫可以有許多表。但是在Elasticsearch中,每個索引只能有一種類型。
在以前的Elasticsearch版本中,一個索引可以有不止一種類型,但是現在它被棄用了。如果你想知道為什麼,你可以在這裡進行閱讀。地址:https://www.elastic.co/guide/en/elasticsearch/reference/6.1/removal-of-types.html
Elasticsearch 請求
是時候開始動手了,我們來向Elasticsearch發出第一個請求:
在這個請求中,我們實際上做了很多事情:
- 創建了一個索引 tweets
- 創建了一個類型 doc
- 對一個包含有關一條推文信息的新文檔進行了索引
現在我們來索引其他幾個文檔:
為了檢索單個文檔,我們可以發出一個GET請求並指定一個該文檔的地址。其索引、類型和id如下:
對所有文檔的簡單搜索如下:
但是我們現在所做的“搜索”是沒有用的,因為它只返回了一個所有文檔的列表。讓我們進行一個真正的搜索,並試圖找到特定作者的文檔:
我們可以更進一步,讓它變得更復雜。例如,讓我們對文本字段進行全文搜索,並根據tweet擁有的點贊數量來對其進行篩選:
或者代替按“贊”來過濾推文,我們可以對其進行排序,並將最受歡迎的推文顯示在第一個:
Django和 Elasticsearch 實戰
現在,當你瞭解了Elasticsearch是什麼以及如何使用它時,讓我們用Django來創建一個簡單的web應用程序,它將使用Elasticsearch的強大功能。
我們將嘗試創建一個web應用程序,它將幫助我們搜索精彩的TED演講。最終的結果是這樣的:
首先,我們將下載關於TED演講的原始數據,比如它們的名稱、描述、文字記錄等等。然後,我們將該數據插入到關係型數據庫中,並將關係型數據庫中的部分數據索引到Elasticsearch中。之後,我們將創建一個頁面,該頁面將與Elasticsearch進行交互,並根據用戶在該頁面上鍵入的搜索查詢來顯示最相關並且最流行的演講。
你可以在這裡找到這個應用程序的源代碼。地址:https://github.com/apirobot/django-elasticsearch-ted-talks
設置項目
我們的項目將使用PostgreSQL(作為關係型數據庫)、Elasticsearch和Django。設置一切的最簡單方法是使用Docker。在一個容器中運行Elasticsearch之前,我們已經使用了Docker。現在我們有3個容器。一個用於PostgreSQL,一個用於Elasticsearch,還有一個用於Django web應用程序。
讓我們從創建一個空項目開始:
添加 requirements.txt 文件:
並更新項目的設置文件:
現在,我們就可以配置Docker了。
讓我們為我們的web應用程序創建一個Docker文件:
並添加start bash腳本,它將在我們啟動一個帶有web應用程序的容器之後開始執行:
正如我之前所說,我們將有3個容器,這些容器之間應該能夠進行通信。例如,我們的web應用程序應該能夠向PostgreSQL和Elasticsearch容器發送查詢。運行多容器Docker應用程序的最佳工具是Docker Compose。通過Docker Compose,我們可以使用YAML文件來配置我們的應用程序的服務。它看起來是這樣的:
在運行Docker Compose之前,我們應該創建.env文件。在這個文件中,我們將存儲一些重要的環境變量:
現在我們可以開始了:
當這些容器準備好後,你應該就能打開主頁了:
設置項目的最後一步是創建一個django應用程序:
並將其添加到已安裝的應用程序列表中:
將數據插入關係型數據庫
讓我們創建一個模型:
並運行遷移:
現在,當我們有了數據庫中的一個表和一個對這個表進行操作的模型,我們就應該用有關TED演講的信息來填充該數據庫。
我將從kaggle下載包含數據的csv文件,並使用pyexcel庫處理這些文件。如果你要繼續,請確保你將ted_main.csv和transcripts.csv文件複製到了你項目的根目錄中。
處理CSV文件的腳本:
打開一個shell並運行我們剛剛編寫的populate方法:
如果該腳本運行時沒有出現任何錯誤,那你的數據庫就應該填入了數據。
將數據索引到Elasticsearch
現在讓我們來定義一個Elasticsearch索引和TalkDocument類:
這個類基本上用Elasticsearch連接我們的關係型數據庫。為了創建一個索引talks,並將數據從該關係型數據庫索引到Elasticsearch中,我們應該運行來自django_elasticsearch_dsl庫的管理命令:
如果你現在嘗試向Elasticsearch發出一個請求,你會看到和我們在關係型數據庫中所擁有的數據相同的數據,除了url字段,因為我們沒有索引它:
搜索演講
讓我們來創建一個搜索相關演講的函數。它將分析名稱、描述、演講者和文字記錄字段,並增加瀏覽量最高的演講:
你可以在shell中使用這個函數:
創建REST API 端點
現在讓我們使用Django REST框架來創建一個簡單的API。我們稍後將在創建web頁面時開始使用它。
首先,定義一個序列化器:
創建一個視圖:
另外,別忘了向urlpatterns列表中添加一個新的url:
創建一個頁面
最後一步是創建一個頁面。我將使用Vue.js以便在不刷新頁面的情況下動態刷新演講列表。但是你可以使用任何你想使用的工具。甚至於用純Javascript編寫所有東西。我選擇Vue.js是因為它簡單易用。
我們來添加一個視圖:
創建一個模板:
並更新urlpattern:
結論
在本文中,我們從較高的層次介紹了Elasticsearch,但是它有許多特性是超出本文範圍的。
為了進一步學習,你可以閱讀文檔,或者更好的方法是嘗試自己構建一些東西。玩得開心!
英文原文:https://apirobot.me/posts/django-elasticsearch-searching-for-awesome-ted-talks
閱讀更多 Python部落 的文章