最近在努力的翻译Apple的测试文档,英文差果然是一个硬伤。

背景

博客内容越来越多了,慢慢的发现有时候需要一个搜索引擎来处理一些搜索的要求。当然,不需要那么复杂的逻辑,我们的博客只需要一个很小很小的搜索引擎,甚至不需要很高大上的算法。

PS:百度站内搜索也是一个解决方案,不过用它的搜索,整个网站风格就变了,所以还是决定自己写一个。

思路

思路其实很简单,把关键字拿去比对标题和内容就好了,比如输入一个关键字,先去把包含这个关键字的标题的文章抓出来,再把内容包含该关键字的文章,去重一下就OK了。

最初的思路是抓出来去重,后来我实践中试了一下,搜索有点慢,我就做了一下优化处理,在判断标题的时候也判断内容,如果标题不存在,内容存在,就放到搜索结果中,这样就不用去重处理了。

前端

前端首先要放一个搜索框出来,提供一个输入的地方。

还要有一个搜索结果的展示页。这个展示页效果大概是这样的。

导航页和右侧的边栏是直接从base.html中继承过来的,完全不用动,那么其实就是增加一个搜索数量,还有搜索结果。

前端的代码长这样:

{% extends "blog/base.html" %}
{% block bodycontent %}{% if SearchStatus == 'Error' %}<div class="well fade in daytips"><button type="button" class="close" data-dismiss="alert">×</button><strong>作者水平有限,并没有关于<font color="red"><b>"{{ keyword }}"</b></font>的内容,请换一个词试试</strong></div>{% endif %}{% if SearchStatus == 'Success' %}<div class="well fade in daytips"><strong>关于<font color="red"><b>"{{ keyword }}"</b></font>的搜索结果一共有<fontcolor="red"><b>"{{ ResultAmount }}"</b></font>条</strong></div><div id="article-list">{% for x in SearchResult %}<article class="excerpt excerpt-first"><header><a class="cat" href="#" id="wybtype"> {{ x.blog_type }} <i></i></a><h2><a class="gotoArchive" href="{% url 'article' x.id %}"title="{{ x.blog_title }}">{{ x.blog_title }}</a></h2></header><p class="meta"><span class="posttime">{{ x.blog_timestamp }}</span><span class="viewnum">浏览(<a href="#">{{ x.blog_clicknum }}</a>)</span><p class="note">{{ x.blog_body | slice:':300' }}</p><footer class="entry-footer"><a class="more-link gotoArchive" rel="nofollow" href="{% url 'article' x.id %}">继续阅读 »</a></footer></article>{% endfor %}</div>{% endif %}
{% endblock %}

展示的时候要考虑两种情况,如果没有结果,要给一个友好的提示,比如我代码中这样的。

有搜索结果,就要告诉访问者,搜索的关键字是什么,总共有多少结果。

那么问题来了,要从后端获取哪些数据?

后端处理

url就不说了,要交互肯定是需要一个search的url。

逻辑处理大概是这样的,先获取前端送过来的关键字,然后用这个关键字对数据库进行全部搜索,包括标题和内容。把符合条件的文章放到一个列表中。最后返回的时候,这个列表的长度就是记录数。

代码如下:

def get_search(request):keyword = request.POST['searchWords']allArticle = BlogBody.objects.all()SearchResult = []for x in allArticle:if keyword in x.blog_title:SearchResult.append(x)elif keyword in x.blog_body:SearchResult.append(x)SearchStatus = "Error" if len(SearchResult) == 0 else "Success"ResultAmount = len(SearchResult)return render(request, 'blog/search.html', {"keyword": keyword,"SearchResult": SearchResult,"SearchStatus": SearchStatus,"ResultAmount": ResultAmount})

最后

做的东西是很简单,但是在博客数量大到一定程度的时候,性能会比较差,所以后续可能要对搜索的逻辑做一下优化。

Django博客开发(十三)—一个简单的站内搜索相关推荐

  1. 如何使用hugo搭建个人博客(五):添加站内搜索(gcse)

    站内搜索推荐使用google custom search engine(gsce) gcse的使用方法强烈推荐阅读:Hexo博客优化配置之–为自己博客添加站内搜索 关键部分: 下面介绍如何在crisp ...

  2. Django 博客开发教程 6 - 真正的 Django 博客首页视图

    在此之前我们已经编写了 Blog 的首页视图,并且配置了 URL 和模板,让 Django 能够正确地处理 HTTP 请求并返回合适的 HTTP 响应.不过我们仅仅在首页返回了一句话:欢迎访问我的博客 ...

  3. Django 博客开发教程 8 - 博客文章详情页

    首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容.现在让我们来开发博客的详情页面,有了前面的基础,开发流程都是一样 ...

  4. Django博客开发5----xadmin

    一.安装配置 1.xadmin的安装 下载zip源码 https://github.com/sshwsfc/xadmin/tree/django2 pip install xadmin-django2 ...

  5. 【Django博客开发教程】:数据查询 Article.objects.all()

    进行数据查询之前,我们需要先进入我们的管理后台,在里面添加一些数据.然后我们用Pycharm打开我们的数据库.具体操作方法:用Pycharm可视化操作数据库 我们的数据结构长这般模样: 双击blog_ ...

  6. Django 3.2.5博客开发教程:HelloWorld欢迎页面

    基础配置做好了之后,我们就可以先迁移数据到数据库,然后启动我们的项目,感受Django的魅力. 在Pycharm左下角底部的Terminal,会弹出Terminal终端窗口,Pycharm自动会帮我们 ...

  7. Django 3.2.5博客开发教程:URL与视图函数

    在讲URL与视图函数之前我们先给大家简单介绍一下用户访问网站的流程.我们访问一个网站的时候,一般先打开浏览器,然后在浏览器的地址栏里输入一个网址,也就是URL,然后回车,我们就可以在浏览器里看到这个网 ...

  8. Django 3.2.5博客开发教程:使用富文本编辑器添加数据

    在Django admin后台添加数据的时候,文章内容文本框想发布一篇图文并茂的文章需就得手写Html代码,这十分吃力,也没法上传图片和文件.这显然不是我等高大上程序猿想要的. 为提升效率,我们可以使 ...

  9. Django 3.2.5博客开发教程:一些常用的模板使用方法

    一.django static文件的引入方式 1.在django project中创建 static文件夹 2.settings.py中配置要在 STATIC_URL = '/static/' 下边 ...

最新文章

  1. 快速实现Apache二级域名的方法
  2. 完成登录并生成JWT
  3. 设备的分配与调度简单方案_连铸生产调度与动态重调度的优化与研究-3,炼钢技术(3)原创...
  4. java显示时间_Java如何显示日期和时间?
  5. c# 科学计数法值转换成正常值,返回字符串
  6. HDU2966 In case of failure(浅谈k-d tree)
  7. 三机齐发!五大全球首发的“安卓机皇”4999元起,“安卓之光” 5999元起
  8. java jxl label_jxl.write.label
  9. 最近帮客户优化的一个通讯应用
  10. 高等数学干吗要研究级数问题?
  11. ns3学习之初识ns3
  12. IDM统一认证功能说明
  13. 强子对撞机下午3时半开始一次全轨道试验,如果产生黑洞,人类将在今日消失
  14. python不能复制粘贴_python 复制与粘贴处理笔记
  15. Contrastive Adaptation Network for Unsupervised Domain Adaptation
  16. 湖南省中职计算机应用教资笔试+面试心得
  17. Go语言使用谷歌浏览器打开指定网址
  18. 三十六计第三计 借刀杀人
  19. html嵌入bilibili视频
  20. ansys添加力矩_ansys施加力矩方法

热门文章

  1. 人工智能之智能机器人
  2. 荨麻疹自我治理指南(民间版)
  3. 什么是字节码?采用字节码的好处是什么?
  4. Protege-OWL API中文版
  5. android 音频显示器,安卓手机投屏(带声音同步)教程
  6. 基于Android的文本笔记类APP设计
  7. 规划过程组-项目管理-PMP
  8. 函数——IIFE、作用域、函数调用、函数应用、闭包
  9. DNS?本地填写的DNS有什么用?DNS怎么工作的?
  10. paraview高级动画功能