1. 程式人生 > >第 11 篇:基於 drf-haystack 的文章搜尋介面

第 11 篇:基於 drf-haystack 的文章搜尋介面

![](https://img2020.cnblogs.com/blog/759200/202004/759200-20200415161158343-1662112908.jpg) 作者:[HelloGitHub-追夢人物](https://www.zmrenwu.com) 在 django 部落格教程中,我們使用了 django-haystack 和 Elasticsearch 進行文章內容的搜尋。django-haystack 預設返回的搜尋結果是一個類似於 django `QuerySet` 的物件,需要配合模板系統使用,因為未被序列化,所以無法直接用於 django-rest-framework 的介面。當然解決方案也很簡單,編寫相應的序列化器將返回結果序列化就可以了。 但是,通過之前的功能我們看到,使用 django-rest-framework 是一個近乎標準化但又枯燥無聊的過程:首先是編寫序列化器用於序列化資源,然後是編寫檢視集,提供對資源各類操作的介面。既然是標準化的東西,肯定已經有人寫好了相關的功能以供複用。此時就要發揮開源社群的力量,去 GitHub 使用關鍵詞 rest haystack 搜尋,果然搜到一個 [drf-haystack](https://github.com/rhblind/drf-haystack) 開源專案,專門用於解決 django-rest-framework 和 haystack 結合使用的問題。因此我們就不再重複造輪子,直接使用開源第三方庫來實現我們的需求。 既然要使用第三方庫,第一步當然是安裝它,進入專案根目錄,執行: ```bash $ pipenv install drf-haystack ``` 由於需要使用到搜尋功能,因此需要啟動 Elasticsearch 服務,最簡單的方式就是使用專案中編排的 Elasticsearch 映象啟動容器。 專案根目錄下執行如下命令啟動全部專案所需的容器服務: ```bash $ docker-compose -f local.yml up --build ``` 啟動完成後執行 docker ps 命令可以檢查到如下 2 個執行的容器,說明啟動成功: ``` hellodjango_rest_framework_tutorial_local hellodjango_rest_framework_tutorial_elasticsearch_local ``` 接著建立一些文章,以便用於搜尋測試,可以自己在 admin 後臺新增,當然最簡單的方法是執行專案中的 fake.py 指令碼,批量生成測試資料: ```bash $ docker-compose -f local.yml run --rm hellodjango.rest.framework.tutorial.local python -m scripts.fake ``` 測試文章生成後,還要執行下面的命令給文章的內容建立索引,這樣搜尋引擎才能根據索引搜尋到相應的內容: ```bash $ docker-compose -f local.yml run --rm hellodjango.rest.framework.tutorial.local python manage.py rebuild_index # 輸出如下 Your choices after this are to restore from backups or rebuild via the `rebuild_index` command. Are you sure you wish to continue? [y/N] y Removing all documents from your index because you said so. All documents removed. Indexing 201 文章 GET /hellodjango_blog_tutorial/_mapping [status:404 request:0.005s] ``` > **注意** > > 如果生成索引時看到如下錯誤: > > elasticsearch.exceptions.ConnectionError: Connecti