Docker中安裝Elasticsearch及如何設定通過關鍵字的查詢
需求分析:
當用戶在一些網上購物時,需要時通過搜尋框來查詢需要的商品,而要搜尋的商品就是使用者查詢的關鍵字,使用者通過關鍵字的查詢,我們要為使用者提供相關的搜尋結果。
這種需求依賴資料庫的模糊查詢like關鍵字可以實現,但是like關鍵字的效率極低,而且查詢需要在多個欄位中進行,使用like關鍵字也不方便。
我們引入搜尋引擎來實現全文檢索。全文檢索即在指定的任意欄位中進行檢索查詢。
搜尋引擎原理
通過搜尋引擎進行資料查詢時,搜尋引擎並不是直接在資料庫中進行查詢,而是搜尋引擎會對資料庫中的資料進行一遍預處理,單獨建立起一份索引結構資料。
我們可以將索引結構資料想象成是字典書籍的索引檢索頁,裡面包含了關鍵詞與詞條的對應關係,並記錄詞條的位置。
我們在通過搜尋引擎搜尋時,搜尋引擎將關鍵字在索引資料中進行快速對比查詢,進而找到資料的真實儲存位置。
Elasticsearch
開源的 Elasticsearch 是目前全文搜尋引擎的首選。它可以快速地儲存、搜尋和分析海量資料。維基百科、Stack Overflow、Github 都採用它。
搜尋引擎在對資料構建索引時,需要進行分詞處理。分詞是指將一句話拆解成多個單字或詞,這些字或詞便是這句話的關鍵詞;
Elasticsearch 不支援對中文進行分詞建立索引,需要配合擴充套件elasticsearch-analysis-ik來實現中文分詞處理。
使用Docker安裝Elasticsearch及其擴充套件
由於Elasticsearch 是用 java來寫的,所以我們需要在我們的環境中有對應的java,然後把java環境搭建好之後, 把elasticsearch元件安裝進去,在將對中文擴充套件的支援在安裝進去name一整套的方案才能實現; 但是如果我們換臺電腦的話又得重新安裝這些環境,, 使用Docker 的話可以將其做成一個映象, 將其分發出去就是現成的飯, 直接吃就ok了;簡化了我們安裝的過程;
獲取映象,可以通過網路pull
docker image pull delron/elasticsearch-ik:2.4.6-1.0
或者用自己拉取好的映象檔案:
docker load -i elasticsearch-ik-2.4.6_docker.tar
修改elasticsearch的配置檔案 elasticsearc-2.4.6/config/elasticsearch.yml第54行,更改ip地址為本機ip地址
network.host: 127.0.0.1
建立docker容器執行
docker run -dti --network=host --name=elasticsearch -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config Desktop/elasticsearch-ik:2.4.6-1.0
使用haystack對接Elasticsearch
我們在django中可以通過使用haystack來呼叫Elasticsearch搜尋引擎。
安裝
pip install drf-haystack
pip install elasticsearch==2.4.1 # 指定版本
drf-haystack是為了在REST framework中使用haystack而進行的封裝(如果在Django中使用haystack,則安裝django-haystack即可)。
註冊應用
INSTALLED_APPS = [
...
'haystack',
...
]
配置
在配置檔案中配置haystack使用的搜尋引擎後端
# Haystack
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/', # 此處為elasticsearch執行的伺服器ip地址,埠號固定為9200
'INDEX_NAME': 'xxshopping', # 指定elasticsearch建立的索引庫的名稱
},
}
# 當新增、修改、刪除資料時,自動生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
注意:
HAYSTACK_SIGNAL_PROCESSOR 的配置保證了在Django執行起來後,有新的資料產生時,haystack仍然可以讓Elasticsearch實時生成新資料的索引;
建立索引類:
商品SKU: 一個商品的詳細資訊;
通過建立索引類,來指明讓搜尋引擎對哪些欄位建立索引,也就是可以通過哪些欄位的關鍵字來檢索資料。
在應用中新建 search_indexes.py 檔案,這個檔名字是會被 hastack多去索引的, 裡面用於存放索引類;
get_model 這個方法是說明我們最終建立索引的所有欄位都是跟這個模型類視有關係的,在這個方法裡真正的指明;
建立序列化器:
最後建立建立索引的資料:
python manage.py rebuild_index 選 y
此時, 在我們的資料庫中就有了我們索引的資料;
接下來,我們的索引資料有了, 那我們需提供給前端一個檢視,這個檢視接收到前端的關鍵詞通過ES進行查詢,:
建立索引的序列器:
在我們應用的路由中進行註冊:
最後就是設定我們前端的search.html 的頁面,及對應的js載入檔案;