在 docker 中使用 Elasticsearch 作為 django 的 search backend

目前手上的專案用了 django 作為網站的 Framework,而為了確保所有開發人員能夠在自己的開發機上用相同的環境進行開發,所以我們把整個 django 專案用 docker-compose 包裝成容器。

且為了未來專案正式上線時,可以放在 AWS 上,並盡量使用 AWS 的 managed service,所以選擇了 Elasticsearch 來作為 search backend。

這篇文章是把 Elasticsearch 加入 docker-compose 中的 django 專案的筆記。

第一步 – 加入 Elasticsearch

在專案的根目錄編輯 docker-compose.yml,加上以下的設定:

這邊要注意到的我們使用了 Elasticsearch 1.x.x。原因是 django 的搜尋套件 haystack 目前只支援 Elasticsearch 1.x.x。

第二步 – 安裝需要的 python 套件

因為我們把 django 包在 docker 裡面,這個 django 的 container 啟動時會讀取 requirements.txt 安裝必要的 python 套件,所以在裡面加上這次需要的套件:

然後視狀況重新啟動整個專案的 containers

到這裡請由輸入訊息確認您的 django、Database、Elasticsearch 都有跑起來

第三步 – 設定 django 的 settings.py

接下來我們要設定 haystack 這個套件來做 django 的搜尋功能,讓 haystack 去跟 Elasticsearch 要搜尋結果。在 settings.py 加上以下的設定:

這樣寫的目的是讓 elasticsearch 和 hasystack 在原有的 apps 前面載入。

然後再加入

第四步 – 設定 django 內的 Model、View、Templates

再來我們要告訴 haystack 要對哪些 Model 做搜尋,這邊我們會以 Product 這個 model 來做範例。首先新增 product/search_indexes.py,內容如下:

新增 templates/search/product/product_text.txt,要注意的是這個檔案的檔名必須跟你的 model name 相符、路徑中的 product 請替換成您自己的 app name。此檔案內容如下:

然後新增 templates/search/search.html

修改 urls.py,加上下面這行:

再來 update search index:

第五步 – 測試

測試方式會依照您的 django 專案有所不同。以我的專案來說,大致上是:

  1. 用任何方式新增物件,可以是用自己設計的新增頁面、也可以是 django 後台,甚至如果要用 shell 直接新增也可以
  2. 執行 docker-compose run web ./manage.py update_index,用 django 的 command 更新 search index
  3. 到 http://localhost:8000/search/ 以關鍵字搜尋看看

Comments

comments

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料