django 使用全局搜索功能的实例详解


Posted in Python onJuly 18, 2019

安装需要的包

1 第一步:

全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理。

haystack:全文检索的框架,支持whoosh、solr、Xapian、Elasticsearc四种全文检索引擎

whoosh:纯Python编写的全文搜索引擎对于小型的站点,whoosh已经足够使用

jieba:一款免费的中文分词包

1)在虚拟环境中依次安装需要的包。

pip install django-haystack
pip install whoosh
pip install jieba

2 注册app

INSTALLED_APPS = (
  ...
  'haystack',
)

创建的models

class GoodInfo(models.Model):
    message = models.CharField(max_length=100)
    content = models.TextField()

    def __str__(self):
      return self.message

3 在settings 中配置搜索引擎

# 全文搜索引擎的配置
HAYSTACK_CONNECTIONS = {
  'default': {
    # 使用whoosh引擎
    'ENGINE': 'haystack.backend.whoosh_cn_backend.WhooshEngine',
    # 索引文件路径
    'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
  }
}

#当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

4 在项目的urls.py中添加搜索的配置。

url(r'^search/', include('haystack.urls')),

5 在创建的app目录下创建search_indexes.py 编写一下程序

from haystack import indexes
from .models import GoodInfo

# 对指定的某个类的某些数据建立索引
class GoodInfoIndex(indexes.SearchIndex, indexes.Indexable):
  text = indexes.CharField(document=True, use_template=True)

  def get_model(self):
    return GoodInfo

  def index_queryset(self, using=None):
    return self.get_model().objects.all()

6 在templates目录下创建"search/indexes/app06/"目录。(app06 为自己创建的app的名称)

在文件夹中创建 "goodinfo_text.txt"文件。 (goodinfo 为自己创建的数据库的名称)

#指定索引的属性
    {{object.content}} (content 为自己创建的表的一个字段 把这个字段指定为索引字段)

7 找到虚拟环境django下安装的haystack目录。

/home/python/.virtualenvs/django/lib/python2.7/site-packages/haystack/backends/

在上面的目录中创建ChineseAnalyzer.py文件。

import jieba
  from whoosh.analysis import Tokenizer, Token

  class ChineseTokenizer(Tokenizer):
    def __call__(self, value, positions=False, chars=False,
           keeporiginal=False, removestops=True,
           start_pos=0, start_char=0, mode='', **kwargs):
      t = Token(positions, chars, removestops=removestops, mode=mode,
           **kwargs)
      seglist = jieba.cut(value, cut_all=True)
      for w in seglist:
        t.original = t.text = w
        t.boost = 1.0
        if positions:
          t.pos = start_pos + value.find(w)
        if chars:
          t.startchar = start_char + value.find(w)
          t.endchar = start_char + value.find(w) + len(w)
        yield t

  def ChineseAnalyzer():
    return ChineseTokenizer()

8)复制whoosh_backend.py文件,改为如下名称:

注意:复制出来的文件名,末尾会有一个空格,记得要删除这个空格。

whoosh_cn_backend.py

9)打开复制出来的新文件,引入中文分析类,内部采用jieba分词。

from .ChineseAnalyzer import ChineseAnalyzer

10)更改词语分析类。

查找

analyzer=StemmingAnalyzer()

改为

analyzer=ChineseAnalyzer()

11)初始化索引数据。

python manage.py rebuild_index

按照提示 输入 y 后 生成索引 在主目录下 会生成一个whoosh_index 文件夹 其中放置三个索引文件

配置好后 就该开始使用了

按照配置,在admin管理中添加数据后,会自动为数据创建索引,可以直接进行搜索,可以先创建一些测试数据。

1)在app06/views.py中定义视图query。

def query(request):
  return render(request,'booktest/query.html')

2)在app06/urls.py中配置。

url(r'^query/', views.query),

3)在templates/app06/目录中创建模板query.html。

参数q表示搜索内容,传递到模板中的数据为query。

<html>
<head>
  <title>全文检索</title>
</head>
<body>
<form method='get' action="/search/" target="_blank">( 提交的路径就是 在urls 中配置的)
  <input type="text" name="q"> # (这里注意 input的name属性 必须是 q 不能改变)
  <br>
  <input type="submit" value="查询">
</form>
</body>
</html>

4)自定义搜索结果模板:在templates/search/目录下创建search.html。

搜索结果进行分页,视图向模板中传递的上下文如下:

(这个上下文 是 搜素引擎自动给返回的 不需要我们自己去写视图函数来进行返回 直接进行使用就可以)

query:搜索关键字

page:当前页的page对象

paginator:分页paginator对象

视图接收的参数如下:

参数q表示搜索内容,传递到模板中的数据为query

参数page表示当前页码

<html>
<head>
  <title>全文检索--结果页</title>
</head>
<body>
<h1>搜索 <b>{{query}}</b> 结果如下:</h1>
<ul>
{%for item in page%}  (注意这里面的对象的获取方式 )
  <li>{{item.object.id}}--{{item.object.content|safe}}</li>
{%empty%}
  <li>啥也没找到</li>
{%endfor%}
</ul>
<hr>
{%for pindex in page.paginator.page_range%} (后面的是返回的是全部的页码)
  {%if pindex == page.number%} (page.number) 返回的是当前的页码
    {{pindex}}  
  {%else%} (按照页码进行翻页的时候 也要注意 这样的翻页方式)
    <a href="?q={{query}}&page={{pindex}}" rel="external nofollow" >{{pindex}}</a>  
  {%endif%}
{%endfor%}
</body>
</html>

5)运行服务器,在浏览器中输入如下地址:

http://127.0.0.1:8000/query/

以上这篇django 使用全局搜索功能的实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
python实现计算倒数的方法
Jul 11 Python
Python实现截屏的函数
Jul 25 Python
python常用知识梳理(必看篇)
Mar 23 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
Feb 21 Python
深入学习python多线程与GIL
Aug 26 Python
python2.7实现复制大量文件及文件夹资料
Aug 31 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
Feb 14 Python
Python格式化输出--%s,%d,%f的代码解析
Apr 29 Python
Vs Code中8个好用的python 扩展插件
Oct 12 Python
详解Python常用的魔法方法
Jun 03 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 Python
Django中Middleware中的函数详解
Jul 18 #Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 #Python
react+django清除浏览器缓存的几种方法小结
Jul 17 #Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 #Python
在Django model中设置多个字段联合唯一约束的实例
Jul 17 #Python
对django views中 request, response的常用操作详解
Jul 17 #Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 #Python
You might like
SONY ICF-SW55的电路分析
2021/03/02 无线电
PHP调用Twitter的RSS的实现代码
2010/03/10 PHP
php商品对比功能代码分享
2015/09/24 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
2020/09/13 PHP
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
基于Jquery和html5实现炫酷的3D焦点图动画
2016/03/02 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
AngularJS入门教程之AngularJS表达式
2016/04/18 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
微信小程序支付功能 php后台对接完整代码分享
2018/06/12 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
Python 错误和异常代码详解
2018/01/29 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
HTML5仿微信聊天界面、微信朋友圈实例代码
2018/01/29 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
程序员求职信
2014/04/16 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
反腐倡廉心得体会2016
2016/01/13 职场文书
化工生产实习心得体会
2016/01/22 职场文书