搜索

谈搜索,不得不提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的源然后再安装

  1. 更新包
$ sudo apt-get update
  1. 安装证书
$ sudo apt-get install \    apt-transport-https \    ca-certificates \    curl \    gnupg-agent \    software-properties-common
  1. 添加docker的官方GPGkey
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. 添加docker源
$ sudo add-apt-repository \   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \   $(lsb_release -cs) \   stable"

安装 docker ce

  1. 更新包索引
$ sudo apt-get update
  1. 安装docker
$ sudo apt-get install docker-ce
  1. 检测是否安装成功
$ 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 <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 ./ik

ik所在文件下创建名为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# 实时更新indexHAYSTACK_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)

创建索引数据模板

  1. 在templates中创建文件search/indexes/yourappname/modelname_text.txt,所以本项目需要创建search/indexes/news/news_text.txt,文件内容如下:
   {{ object.title }}   {{ object.digest }}   {{ object.content }}   {{ object.author.username }}
  1. 创建索引

    按上面的步骤配置好后,就可以运行haystack的命令创建索引了

    ~$ python manage.py rebuild_index
  2. 视图编写

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

路由

在news/urls.py中添加如下路由

python path('news/search/', views.NewsSearchView.as_view(), name='news_search')

4.前端代码

django 搜索相关推荐

  1. Django 搜索结果分页的实现 以及点击下一页搜索条件丢失可能的原因分析

    1.Django 搜索结果分页的实现 在这里我们用django自带的分页模块来实现 这个paginator对象中带有如下属性: #per_page:每页显示条目数量 #count:数据总个数 #num ...

  2. django搜索 关键字 全文检索haystack 搜索分词数据库

    Django Haystack 简介 django-haystack 是一个专门提供搜索功能的 django 第三方应用,它支持 Solr.Elasticsearch.Whoosh.Xapian 等多 ...

  3. python爬虫 django搜索修改更新数据_django_数据库操作—增、删、改、查

    增加 增加数据有两种方法 1> sava >>> from datetime import date >>> book = BookInfo( btitle= ...

  4. python爬虫 django搜索修改更新数据_一文搞懂Django数据库查询操作

    本文略长,读完约需十分钟.当做复习笔记效果更佳. 查询操作: 数据查询是数据库操作中一个非常重要的技术.查询一般就是使用filter.exclude以及get三个方法来实现.我们可以在调用这些方法的时 ...

  5. Django搜索工具——全文检索

    全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理 haystack:全文检索的框架,支持whoosh.solr.Xapian.Elasticsearc四种全文检索 ...

  6. python爬虫 django搜索修改更新数据_python应用:Django中更新多个对象数据与删除对象的方法...

    Python是一种解释型脚本语言,可以应用于以下领域: web和Internet开发 科学计算和统计 人工智能 教育 桌面界面开发 软件开发 后端开发 网络爬虫 更新多个对象 例如说我们现在想要将Ap ...

  7. Django的APP,视图,url和模板

    新建app 在项目的根目录执行python manage.py startapp app名字 URL概念: URL(Uniform Resoure Locator)统一资源定位符是对可以从互联网上得到 ...

  8. Django templates 和 urls 拆分

    如果在Django项目 下面新建了blog和polls两个APP应用,在每个APP下面都各自新建自己的url和templates,那么我们需要如何进行项目配置呢? INSTALLED_APPS = [ ...

  9. django开源电子文档管理系统_Python实操技术分享:Django文件管理系统,Apple的学习思路...

    一.客户端产品要求 有一个更新状态按钮,点击更新数据后会弹出结果页面 作用是检查本次读取的文档信息与数据库中文档数据的区别.同时对数据库进行对应的新增和删除操作.然后把最终的数据库信息按行显示出来,包 ...

最新文章

  1. PSAM卡---中国人民银行PSAM卡管理规范.doc
  2. Mouse Without Borders 一套鼠标键盘控制多台电脑
  3. JDK14的新特性:Lombok的终结者record
  4. TCP服务端实现并发
  5. ykcchf 2013 v2.1101 最新版下载
  6. Android开发笔记(一百六十六)H5通过WebView录像上传
  7. 诺基亚7P可刷华为鸿蒙系统,今日热闻 | 鸿蒙OS 2.0发布、EMUI 11发布、iPhone 12或配备7P镜头...
  8. python的数值类型和运算符_Python全栈工程师(数值类型、运算符)
  9. Pycharm快速入门(5) — Python解释器和环境配置
  10. SpringDataJPA中使用Specification进行表连接多条件分页动态查询
  11. 微信公众号模版消息推送
  12. 使用IDEA工具远程调试SpringBoot应用
  13. 人力面试时常规的面试题
  14. js 获取某一天的前一天时间或者后一天时间
  15. python之批量下载抖音视频
  16. avalonia 控件TextBox 及其他控件文本改变事件
  17. ctf php沙箱,详谈CTF中常出现的PHP反序列化漏洞
  18. flink 单作业模式部署提交作业爆:Trying to access closed classloader. Please check if you store classloaders direc
  19. windows 平台使用dul 抽取Linux oracle ASM 磁盘数据文件
  20. c语言程序设计罗朝盛第三版,c语言程序设计罗朝盛总复习.ppt

热门文章

  1. android xml文件格式,android xml 资源文件中几个格式(@ ? @* @+)的含义
  2. CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)
  3. 【BCFTOOLS】按样本拆分VCF文件
  4. C++数据类型和变量类型。
  5. C/C++隐式类型转换导致的若干问题
  6. android 首选项框架,Android:创建自定义首选项
  7. 自动弹窗被拦截 html,弹出式窗口被阻止怎么办,如何阻止弹出式窗口
  8. python中readlines,在Python中连续两次使用readlines
  9. win10无法装载iso文件_win 10如何装载和弹出ISO映像文件
  10. mac怎么实现文件读写c语言,使用Sublime Text和Xcode在Mac上进行文件输入/输出。 C语言...