django 搜索
搜索
談搜索,不得不提es,全名 Elasticsearch。
自行實現django框架和全文檢索引擎的代碼比較麻煩,抱著不重復造輪子的原則。
選用django的第三方包djangohaystack。它支持多種全文檢索引擎,本項目選擇最流行的全文檢索引擎之一elasticsearch。
安裝elasticsearch很艱難,推薦使用docker,不要安裝windows,會強制下載VirtualBox會與vm沖突的
docker
什么是docker?
- 簡化創建,部署,運行應用程序的一個工具
- 打包應用程序所需的庫和依賴環境
- 精簡的虛擬機
docker vs 虛擬機
安裝
https://docs.docker.com/install/
- 版本 ce和ee
Docker Engine改為Docker CE(社區版)
Docker Data Center改為Docker EE(企業版)
下面是ubuntu下安裝(來源官網)
如果是第一次安裝,你需要先添加docker的源然后再安裝
????apt-transport-https?\
????ca-certificates?\
????curl?\
????gnupg-agent?\
????software-properties-common
???"deb?[arch=amd64]?https://download.docker.com/linux/ubuntu?\
???$(lsb_release?-cs)?\
???stable"
安裝 docker ce
安裝成功會出現如下輸出:Hello from Docker!
先鏡像加速,不然你會懷疑人生的
編輯文件/etc/docker/daemon.json,沒有就新建。加入以下項目
下面的源可以改掉
{????"registry-mirrors":?["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}
{
??"registry-mirrors":?["https://nelhtz00.mirror.aliyuncs.com"]
}
鏡像和容器的概念
就像類和實例的類,鏡像就是類,容器就是對象
補充docker命令
去docker 官方下載
Shell docker pull <name>:16.04
運行鏡像文件。
docker?run?-i?-tdocker?run?<image-id>
docker?run?-p?<port1>:<port2>?<name>
查看鏡像文件。
docker?image?lsdocker?images
刪除鏡像文件。
docker?rmi?<name>docker?rmi?fce289e99eb9?-f
查看正在運行容器。
docker?ps停止運行的容器。
docker?stop?<container-id>docker?stop?<name>
對于那些不會自動終止的容器,就可以用下面的方式來停止。
docker?container?kill?<container-id>吹了那些多docker,連es都沒吹
搜索功能環境搭建
docker的鏡像:https://hub.docker.com/
注意:因為haystack目前支持的elasticsearch版本為 1.x和2.x
所以這里選擇2.4.6
$?docker?pull?elasticsearch:2.4.6但是外國人開發的,所以安裝中文分詞插件elasticsearch-ik,不安裝分不了中文詞,搜不了中文
下載es-ik后,將其解壓到名為ik的文件夾
~$?unzip?elasticsearch-analysis-ik-1.10.6.zip?-d?./ikik所在文件下創建名為Dockerfile的文件,內容如下
FROM????elasticsearch:2.4.6MAINTAINER????Fisher?""??你下載docker注冊的郵箱??名字@郵箱
ADD?????./ik/?/usr/share/elasticsearch/plugins/ik/??
將Dockerfile同步在ubuntu
sudo?docker?build?-t??你的名字/els-ik:2.4.6?.運行成功后,會在你的docker中創建一個新的鏡像叫做 你的名字/els-ik
最后運行curl命令檢測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,
????"lucene_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',
]
補充settings.py
HAYSTACK_CONNECTIONS?=?{????'default':?{
????????'ENGINE':?'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
????????'URL':?'http://127.0.0.1:9200/',????#?此處為elasticsearch運行的服務器ip地址和端口
????????'INDEX_NAME':?'',???????????#?指定elasticserach建立的索引庫名稱
????},
}
#?搜索結果每頁顯示數量
HAYSTACK_SEARCH_RESULTS_PER_PAGE?=?5
#?實時更新index
HAYSTACK_SIGNAL_PROCESSOR?=?'haystack.signals.RealtimeSignalProcessor'
haystack操作es還需要python的es驅動。
官網 :https://github.com/elastic/elasticsearch-py
pip?install?elasticsearch==2.4.1至此,環境搭建完成。相對應的es,es-ik,haystack,es-python的版本請保持一致。django支持2.x版本,es到了7.x版本
使用
下面代碼來源項目,無需看懂,知道怎么搞就可以了
在需要搜索的app,創建search_indexes.py文件
創建haystack數據模型
from?haystack?import?indexesfrom?.models?import?News
class?NewsIndex(indexes.SearchIndex,?indexes.Indexable):
????"""
????這個模型的作用類似django的模型,它告訴haystack哪些數據會被
????放進查詢回的模型對象中,以及通過哪些字段進行索引和查詢
????"""
????#?這字段必須這么寫,用來告訴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')
????def?get_model(self):
????????"""
????????返回建立索引的模型
????????:return:
????????"""
????????return?News
????def?index_queryset(self,?using=None):
????????"""
????????返回要建立索引的數據查詢集
????????:param?using:
????????:return:
????????"""
????????return?self.get_model().objects.filter(is_delete=False)
創建索引數據模板
???{{?object.digest?}}
???{{?object.content?}}
???{{?object.author.username?}}
創建索引
按上面的步驟配置好后,就可以運行haystack的命令創建索引了
~$?python?manage.py?rebuild_index視圖編寫
class?NewsSearchView(SearchView):
????"""
????新聞搜索視圖
????"""
????#?設置搜索模板文件
????template_name?=?'news/search.html'
????#?重寫get請求,如果請求參數q為空,返回模型News的熱門新聞數據
????#?否則根據參數q搜索相關數據
????def?get(self,?request,?*args,?**kwargs):
????????query?=?request.GET.get('q')
????????if?not?query:
????????????#?顯示熱門新聞
????????????hot_news?=?HotNews.objects.select_related('news__tag').only('news__title',?'news__image_url',?'news_id',
????????????????????????????????????????????????????????????????????????'news__tag__name').filter(
????????????????is_delete=False).order_by('priority',?'-news__clicks')
????????????paginator?=?Paginator(hot_news,?settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE)
????????????try:
????????????????page?=?paginator.get_page(int(request.GET.get('page')))
????????????except?Exception?as?e:
????????????????page?=?paginator.get_page(1)
????????????return?render(request,?'news/search.html',?context={
????????????????'page':?page,
????????????????'paginator':?paginator,
????????????????'query':?query
????????????})
????????else:
????????????#?搜索
????????????return?super().get(request,?*args,?**kwargs)
????def?get_context_data(self,?*args,?**kwargs):
????????"""
????????在context中添加page變量
????????:param?args:?
????????:param?kwargs:?
????????:return:?
????????"""
????????context?=?super().get_context_data(*args,?**kwargs)
????????if?context['page_obj']:
????????????context['page']?=?context['page_obj']
????????return?context
路由
在news/urls.py中添加如下路由
python path('news/search/', views.NewsSearchView.as_view(), name='news_search')
4.前端代碼
總結
- 上一篇: 重装win7系统后u盘不能用怎么办 wi
- 下一篇: java 重要的类