python django使用haystack:全文检索的框架(实例讲解)


Posted in Python onSeptember 27, 2017

haystack:全文检索的框架

whoosh:纯Python编写的全文搜索引擎

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

首先安装这三个包

pip install django-haystack
pip install whoosh
pip install jieba

1.修改settings.py文件,安装应用haystack,

2.在settings.py文件中配置搜索引擎

HAYSTACK_CONNECTIONS = {
 'default': {
  # 使用whoosh引擎
  'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
  # 索引文件路径
  'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
 }
}
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

3. 在templates目录下创建“search/indexes/blog/”目录 采用blog应用名字下面创建一个文件blog_text.txt
#指定索引的属性

{{ object.title }}
{{ object.text}}
{{ object.keywords }}

python django使用haystack:全文检索的框架(实例讲解)

4.在需要搜索的应用下面创建search_indexes

from haystack import indexes
from models import Post #指定对于某个类的某些数据建立索引
class GoodsInfoIndex(indexes.SearchIndex, indexes.Indexable): 
 text = indexes.CharField(document=True, use_template=True)
 def get_model(self):  
 return Post #搜索的模型类
 def index_queryset(self, using=None):  
  return self.get_model().objects.all()

python django使用haystack:全文检索的框架(实例讲解)

5.

1. 修改haystack文件

2. 找到虚拟环境py_django下的haystack目录 这个目录根据自己使用的python环境不同,路径也不一样。

3. 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()

6.

1. 复制whoosh_backend.py文件,改为如下名称

whoosh_cn_backend.py

在复制出来的文件中导入中文分词模块

from .ChineseAnalyzer import ChineseAnalyzer

2. 更改词语分析类 改成中文

查找analyzer=StemmingAnalyzer()改为analyzer=ChineseAnalyzer()

7. 最后一步就是建初始化索引数据

python manage.py rebuild_index

8. 创建搜索模板 在templates/indexes/ 创建search.html模板

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

query:搜索关键字

page:当前页的page对象

paginator:分页paginator对象

9. 在自己的应用视图中导入模块

from haystack.generic_views import SearchView

定义一个类重写get_context_data 方法,这样就可以往模板中传递自定义的上下文。

class GoodsSearchView(SearchView):
def get_context_data(self, *args, **kwargs):


context = super().get_context_data(*args, **kwargs)


context['iscart']=1


context['qwjs']=2


return context

应用的urls文件中添加这条url 将类当一个视图的方法使用 .as_view()

url('^search/$', views.BlogSearchView.as_view())

以上这篇python django使用haystack:全文检索的框架(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现跨文件全局变量的方法
Jul 07 Python
python 函数传参之传值还是传引用的分析
Sep 07 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
利用Python查看微信共同好友功能的实现代码
Apr 24 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
pytorch+lstm实现的pos示例
Jan 14 Python
python 等差数列末项计算方式
May 03 Python
关于Python解包知识点总结
May 05 Python
Python参数传递实现过程及原理详解
May 14 Python
Python logging模块进行封装实现原理解析
Aug 07 Python
python基础之匿名函数详解
Apr 21 Python
写好Python代码的几条重要技巧
May 21 Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 #Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 #Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 #Python
Python计算斗牛游戏概率算法实例分析
Sep 26 #Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 #Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 #Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 #Python
You might like
生成静态页面的PHP类
2006/07/15 PHP
php中cookie的作用域
2008/03/27 PHP
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
PHP的Yii框架中移除组件所绑定的行为的方法
2016/03/18 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
一个简单安全的PHP验证码类、PHP验证码
2016/09/24 PHP
yii2使用gridView实现下拉列表筛选数据
2017/04/10 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
JavaScript中this的使用详解
2013/11/08 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
easyui combotree加载静态数据问题(选不上)解决方法
2016/12/26 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
小程序怎样让wx.navigateBack更好用的方法实现
2019/11/01 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
js实现碰撞检测
2021/01/29 Javascript
python的正则表达式re模块的常用方法
2013/03/09 Python
Python 基础知识之字符串处理
2017/01/06 Python
Python中格式化format()方法详解
2017/04/01 Python
对python中的乘法dot和对应分量相乘multiply详解
2018/11/14 Python
python实现dijkstra最短路由算法
2019/01/17 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
党员学习十八大感想
2014/01/17 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
DIY胆机必读:各国电子管评价
2022/04/06 无线电
python基础之//、/与%的区别详解
2022/06/10 Python