Django项目知识点(五)
微信原文: https://mp.weixin.qq.com/s/zpdb0LA9Qo5sxdX6uyLJwQ
搜索
谈搜索,不得不提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的源然后再安装
更新包
$ sudo apt-get update
安装证书
$ 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
检测是否安装成功
$ sudo docker run hello-world
安装成功会出现如下输出: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 :16.04
运行镜像文件。
docker run -i -t
docker run
docker run -p :
查看镜像文件。
docker image ls
docker images
删除镜像文件。
docker rmi
docker rmi fce289e99eb9 -f
查看正在运行容器。
docker ps
停止运行的容器。
docker stop
docker stop
对于那些不会自动终止的容器,就可以用下面的方式来停止。
docker container kill
吹了那些多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 ./ik
ik所在文件下创建名为Dockerfile的文件,内容如下
FROM elasticsearch:2.4.6
MAINTAINER 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 indexes
from .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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
创建索引数据模板
在templates中创建文件search/indexes/yourappname/modelname_text.txt,所以本项目需要创建search/indexes/news/news_text.txt,文件内容如下:
{{ object.title }}
{{ object.digest }}
{{ object.content }}
{{ object.author.username }}
创建索引
按上面的步骤配置好后,就可以运行haystack的命令创建索引了
~$ python manage.py rebuild_index
视图编写
from haystack.generic_views import SearchView
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
路由
在news/urls.py中添加如下路由
path(‘news/search/’, views.NewsSearchView.as_view(), name=‘news_search’)
学不死,就往死里学。
文章来源: maoli.blog.csdn.net,作者:刘润森!,版权归原作者所有,如需转载,请联系作者。
原文链接:maoli.blog.csdn.net/article/details/102599489
- 点赞
- 收藏
- 关注作者
评论(0)