a.獲取鏡像
# 拉取鏡像到本地倉庫 # docker image pull delron/elasticsearch-ik:2.4.6-1.0 由於pull拉取會比較慢, 可以將百度網盤中的elasticsearch-ik-2.4.6_docker.tar文件傳到虛擬機中 然后導入鏡像: docker load -i elasticsearch-ik-2.4.6_docker.tar # 查看本地倉庫是否有這個鏡像 docker images 或docker image ls
b.將百度雲盤中的elasticsearch.zip文件傳到虛擬機中的家目錄,然后unzip解壓。在虛擬機中的elasticsearch/config/elasticsearch.yml第54行,更改ip地址為0.0.0.0,端口改為8002,默認端口為9200.
# 在xshell中使用rz命令將elasticsearch.zip文件傳到虛擬機的家目錄中 #然后在家目錄中解壓 unzip elasticsearch.zip cd ~/elasticsearch/config # network.host: 172.18.168.123 network.host: 0.0.0.0 # # Set a custom port for HTTP: # http.port: 8002
c.創建docker容器並運行
# 根據拉取到本地的鏡像創建容器,需要將/home/bd/elasticsearch/config配置文件所在目錄修改為你自己的路徑 docker run -dti --network=host --name=elasticsearch -v /home/pyvip/elasticsearch/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0 # 查看是否創建成功 docker container ls -a # 如果STATUS為Up則創建容器成功 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b254fe1ee0eb delron/elasticsearch-ik:2.4.6-1.0 "/docker-entrypoint.…" 3 days ago Up 3 days elasticsearch # 運行如下命令,如果有顯示則elasticsearch配置成功 curl 127.0.0.1:8002
d.進入項目虛擬環境中,安裝相關包
# 進入項目虛擬環境 workon myblog_env pip install django-haystack pip install elasticsearch==2.4.1
e.在settings.py文件中加入如下配置:
INSTALLED_APPS = [ 'haystack', ] ELASTICSEARCH_DSL = { 'default': { 'hosts': '127.0.0.1:8002' }, } # Haystack HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://127.0.0.1:8002/', # 此處為elasticsearch運行的服務器ip地址,端口號默認為9200 'INDEX_NAME': 'dj_pre_class', # 指定elasticsearch建立的索引庫的名稱 }, } # 設置每頁顯示的數據量 HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5 # 當數據庫改變時,會自動更新索引 HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# 在apps/news/search_indexes.py中創建如下類:(名稱固定為search_indexes.py) from haystack import indexes # from haystack import site from .models import News class NewsIndex(indexes.SearchIndex, indexes.Indexable): """ News索引數據模型類 """ text = indexes.CharField(document=True, use_template=True) id = indexes.IntegerField(model_attr='id') title = indexes.CharField(model_attr='title') digest = indexes.CharField(model_attr='digest') content = indexes.CharField(model_attr='content') image_url = indexes.CharField(model_attr='image_url') # comments = indexes.IntegerField(model_attr='comments') def get_model(self): """返回建立索引的模型類 """ return News def index_queryset(self, using=None): """返回要建立索引的數據查詢集 """ return self.get_model().objects.filter(is_delete=False, tag_id=1)
from haystack.views import SearchView as _SearchView class SearchView(_SearchView): # 模版文件 template = 'news/search.html' # 重寫響應方式,如果請求參數q為空,返回模型News的熱門新聞數據,否則根據參數q搜索相關數據 def create_response(self): kw = self.request.GET.get('q', '') if not kw: show_all = True hot_news = models.HotNews.objects.select_related('news'). \ only('news__title', 'news__image_url', 'news__id'). \ filter(is_delete=False).order_by('priority', '-news__clicks') paginator = Paginator(hot_news, settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE) try: page = paginator.page(int(self.request.GET.get('page', 1))) except PageNotAnInteger: # 如果參數page的數據類型不是整型,則返回第一頁數據 page = paginator.page(1) except EmptyPage: # 用戶訪問的頁數大於實際頁數,則返回最后一頁的數據 page = paginator.page(paginator.num_pages) return render(self.request, self.template, locals()) else: show_all = False qs = super(SearchView, self).create_response() return qs
# 創建templates/search/indexes/news/news_text.txt文件(文件名為:應用名_text.txt)
{{ object.title }}
{{ object.digest }}
{{ object.content }}
# 在虛擬機中執行如下命令,生成索引
python manage.py rebuild_index