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解析xml成对应的html示例分享
Apr 02 Python
python中enumerate的用法实例解析
Aug 18 Python
Python中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
Python查询IP地址归属完整代码
Jun 21 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
May 21 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
Pandas的Apply函数具体使用
Jul 21 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
Jan 25 Python
TensorFlow中tf.batch_matmul()的用法
Jun 02 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
php处理json时中文问题的解决方法
2011/04/12 PHP
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
js 字符串操作函数
2009/07/25 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
js判断当前页面用什么浏览器打开的方法
2016/01/06 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
Vue 实现简易多行滚动&quot;弹幕&quot;效果
2020/01/02 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
IDEA配置jQuery, $符号不再显示黄色波浪线的问题
2020/10/09 jQuery
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
深入理解python中的select模块
2017/04/23 Python
python2和python3在处理字符串上的区别详解
2019/05/29 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
什么是python的id函数
2020/06/11 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
学雷锋标语
2014/06/25 职场文书
2014年教育工作总结
2014/11/26 职场文书
素质拓展训练感想
2015/08/07 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android