Django项目知识点(五)
微信原文: https://mp.weixin.qq.com/s/zpdb0LA9Qo5sxdX6uyLJwQ
搜索
談搜索,不得不提es,全名 Elasticsearch。
自行實(shí)現(xiàn)django框架和全文檢索引擎的代碼比較麻煩,抱著不重復(fù)造輪子的原則。
選用django的第三方包djangohaystack。它支持多種全文檢索引擎,本項(xiàng)目選擇最流行的全文檢索引擎之一elasticsearch。
安裝elasticsearch很艱難,推薦使用docker,不要安裝windows,會(huì)強(qiáng)制下載VirtualBox會(huì)與vm沖突的
docker
什么是docker?
簡(jiǎn)化創(chuàng)建,部署,運(yùn)行應(yīng)用程序的一個(gè)工具
打包應(yīng)用程序所需的庫(kù)和依賴環(huán)境
精簡(jiǎn)的虛擬機(jī)
docker vs 虛擬機(jī)
安裝
https://docs.docker.com/install/
版本 ce和ee
Docker Engine改為Docker CE(社區(qū)版)
Docker Data Center改為Docker EE(企業(yè)版)
下面是ubuntu下安裝(來(lái)源官網(wǎng))
如果是第一次安裝,你需要先添加docker的源然后再安裝
更新包
$ sudo apt-get update
安裝證書(shū)
$ sudo apt-get install
apt-transport-https
ca-certificates
curl
gnupg-agent
software-properties-common
添加docker的官方GPGkey
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
添加docker源
$ sudo add-apt-repository
“deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable”
安裝 docker ce
更新包索引
$ sudo apt-get update
安裝docker
$ sudo apt-get install docker-ce
檢測(cè)是否安裝成功
$ sudo docker run hello-world
安裝成功會(huì)出現(xiàn)如下輸出:Hello from Docker!
先鏡像加速,不然你會(huì)懷疑人生的
編輯文件/etc/docker/daemon.json,沒(méi)有就新建。加入以下項(xiàng)目
下面的源可以改掉
{
“registry-mirrors”: [“https://registry.docker-cn.com”,“http://hub-mirror.c.163.com”]
}
{
“registry-mirrors”: [“https://nelhtz00.mirror.aliyuncs.com”]
}
鏡像和容器的概念
就像類和實(shí)例的類,鏡像就是類,容器就是對(duì)象
補(bǔ)充docker命令
去docker 官方下載
Shell docker pull :16.04
運(yùn)行鏡像文件。
docker run -i -t
docker run
docker run -p :
查看鏡像文件。
docker image ls
docker images
刪除鏡像文件。
docker rmi
docker rmi fce289e99eb9 -f
查看正在運(yùn)行容器。
docker ps
停止運(yùn)行的容器。
docker stop
docker stop
對(duì)于那些不會(huì)自動(dòng)終止的容器,就可以用下面的方式來(lái)停止。
docker container kill
吹了那些多docker,連es都沒(méi)吹
搜索功能環(huán)境搭建
docker的鏡像:https://hub.docker.com/
注意:因?yàn)閔aystack目前支持的elasticsearch版本為 1.x和2.x
所以這里選擇2.4.6
$ docker pull elasticsearch:2.4.6
但是外國(guó)人開(kāi)發(fā)的,所以安裝中文分詞插件elasticsearch-ik,不安裝分不了中文詞,搜不了中文
下載es-ik后,將其解壓到名為ik的文件夾
~$ unzip elasticsearch-analysis-ik-1.10.6.zip -d ./ik
ik所在文件下創(chuàng)建名為Dockerfile的文件,內(nèi)容如下
FROM elasticsearch:2.4.6
MAINTAINER Fisher “” 你下載docker注冊(cè)的郵箱 名字@郵箱
ADD ./ik/ /usr/share/elasticsearch/plugins/ik/
將Dockerfile同步在ubuntu
sudo docker build -t 你的名字/els-ik:2.4.6 .
運(yùn)行成功后,會(huì)在你的docker中創(chuàng)建一個(gè)新的鏡像叫做 你的名字/els-ik
最后運(yùn)行curl命令檢測(cè)es是否正常
~$ curl http://127.0.0.1:9200
{
“name” : “Shard”,
“cluster_name” : “elasticsearch”,
“cluster_uuid” : “Pq6BQQhTQN6q6ML6ThPlbw”,
“version” : {
“number” : “2.4.6”,
“build_hash” : “5376dca9f70f3abef96a77f4bb22720ace8240fd”,
“build_timestamp” : “2017-07-18T12:17:44Z”,
“build_snapshot” : false,
“l(fā)ucene_version” : “5.5.4”
},
“tagline” : “You Know, for Search”
}
djangohaystack
pip install django-haystack
settings.py
添加’haystack’
INSTALLED_APPS = [
# ‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘haystack’,
]
補(bǔ)充settings.py
HAYSTACK_CONNECTIONS = {
‘default’: {
‘ENGINE’: ‘haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine’,
‘URL’: ‘http://127.0.0.1:9200/’, # 此處為elasticsearch運(yùn)行的服務(wù)器ip地址和端口
‘INDEX_NAME’: ‘’, # 指定elasticserach建立的索引庫(kù)名稱
},
}
搜索結(jié)果每頁(yè)顯示數(shù)量
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5
實(shí)時(shí)更新index
HAYSTACK_SIGNAL_PROCESSOR = ‘haystack.signals.RealtimeSignalProcessor’
haystack操作es還需要python的es驅(qū)動(dòng)。
官網(wǎng) :https://github.com/elastic/elasticsearch-py
pip install elasticsearch==2.4.1
至此,環(huán)境搭建完成。相對(duì)應(yīng)的es,es-ik,haystack,es-python的版本請(qǐng)保持一致。django支持2.x版本,es到了7.x版本
使用
下面代碼來(lái)源項(xiàng)目,無(wú)需看懂,知道怎么搞就可以了
在需要搜索的app,創(chuàng)建search_indexes.py文件
創(chuàng)建haystack數(shù)據(jù)模型
from haystack import indexes
from .models import News
class NewsIndex(indexes.SearchIndex, indexes.Indexable):
“”"
這個(gè)模型的作用類似django的模型,它告訴haystack哪些數(shù)據(jù)會(huì)被
放進(jìn)查詢回的模型對(duì)象中,以及通過(guò)哪些字段進(jìn)行索引和查詢
“”"
# 這字段必須這么寫(xiě),用來(lái)告訴haystack和搜索引擎要索引哪些字段
text = indexes.CharField(document=True, use_template=True)
id = indexes.CharField(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’)
創(chuàng)建索引數(shù)據(jù)模板
在templates中創(chuàng)建文件search/indexes/yourappname/modelname_text.txt,所以本項(xiàng)目需要?jiǎng)?chuàng)建search/indexes/news/news_text.txt,文件內(nèi)容如下:
{{ object.title }}
{{ object.digest }}
{{ object.content }}
{{ object.author.username }}
創(chuàng)建索引
按上面的步驟配置好后,就可以運(yùn)行haystack的命令創(chuàng)建索引了
~$ python manage.py rebuild_index
視圖編寫(xiě)
from haystack.generic_views import SearchView
class NewsSearchView(SearchView):
“”"
新聞搜索視圖
“”"
# 設(shè)置搜索模板文件
template_name = ‘news/search.html’
路由
在news/urls.py中添加如下路由
path(‘news/search/’, views.NewsSearchView.as_view(), name=‘news_search’)
學(xué)不死,就往死里學(xué)。
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Django项目知识点(五)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微邮付多久到账
- 下一篇: Django项目知识点(四)