django haystack实现全文检索的示例代码


Posted in Python onJune 24, 2020

全文检索里的组件简介

1. 什么是haystack?

1. haystack是django的开源搜索框架,该框架支持Solr,Elasticsearch,Whoosh, *Xapian*搜索引擎,不用更改代码,直接切换引擎,减少代码量。

2. 搜索引擎使用Whoosh,这是一个由纯Python实现的全文搜索引擎, 没有二进制文件等,比较小巧,配置比较简单,当然性能自然略低。

3. 中文分词Jieba,由于Whoosh自带的是英文分词,对中文的分词支持不是太好,故用jieba替换whoosh的分词组件

2. 什么是jieba?

很多的搜索引擎对中的支持不友好,jieba作为一个中文分词器就是加强对中文的检索功能

3. Whoosh是什么

1. Python的全文搜索库,Whoosh是索引文本及搜索文本的类和函数库

2. Whoosh 自带的是英文分词,对中文分词支持不太好,使用 jieba 替换 whoosh 的分词组件。

haystack配置使用(前后端分离)

1. 安装需要的包

pip3 install django-haystack
pip3 install whoosh
pip3 install jieba

2. 在setting.py中配置

'''注册app '''
INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  # haystack要放在应用的上面
  'haystack',
  'myapp', # 这个jsapp是自己创建的app
]


'''配置haystack '''
# 全文检索框架配置
HAYSTACK_CONNECTIONS = {
  'default': {
    # 指定whoosh引擎
    'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
    # 'ENGINE': 'myapp.whoosh_cn_backend.WhooshEngine',   # whoosh_cn_backend是haystack的whoosh_backend.py改名的文件为了使用jieba分词
    # 索引文件路径
    'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
  }
}
# 添加此项,当数据库改变时,会自动更新索引,非常方便
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

3. 定义数据库

from django.db import models

# Create your models here.
class UserInfo(models.Model):
  name = models.CharField(max_length=254)
  age = models.IntegerField()


class ArticlePost(models.Model):
  author = models.ForeignKey(UserInfo,on_delete=models.CASCADE)
  title = models.CharField(max_length=200)
  desc = models.SlugField(max_length=500)
  body = models.TextField()

索引文件生成

1. 在子应用下创建索引文件

在子应用的目录下,创建一个名为 myapp/search_indexes.py 的文件

from haystack import indexes
from .models import ArticlePost

# 修改此处,类名为模型类的名称+Index,比如模型类为GoodsInfo,则这里类名为GoodsInfoIndex(其实可以随便写)
class ArticlePostIndex(indexes.SearchIndex, indexes.Indexable):
  # text为索引字段
  # document = True,这代表haystack和搜索引擎将使用此字段的内容作为索引进行检索
  # use_template=True 指定根据表中的那些字段建立索引文件的说明放在一个文件中
  text = indexes.CharField(document=True, use_template=True)

  # 对那张表进行查询
  def get_model(self): # 重载get_model方法,必须要有!
    # 返回这个model
    return ArticlePost

  # 建立索引的数据
  def index_queryset(self, using=None):
    # 这个方法返回什么内容,最终就会对那些方法建立索引,这里是对所有字段建立索引
    return self.get_model().objects.all()

2.指定索引模板文件

创建文件路径命名必须这个规范:templates/search/indexes/应用名称/模型类名称_text.txt
如:
templates/search/indexes/myapp/articlepost_text.txt

django haystack实现全文检索的示例代码

{{ object.title }}
{{ object.author.name }}
{{ object.body }}

3.使用命令创建索引

python manage.py rebuild_index # 建立索引文件

替换成jieba分词

1.将haystack源码复制到项目中并改名

'''1.复制源码中文件并改名 '''
将 /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/
site-packages/haystack/backends/whoosh_backend.py文件复制到项目中
并将 whoosh_backend.py改名为 whoosh_cn_backend.py 放在APP中如:
myapp\whoosh_cn_backend.py

'''2.修改源码中文件'''
# 在全局引入的最后一行加入jieba分词器
from jieba.analyse import ChineseAnalyzer

# 修改为中文分词法
查找
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()

django haystack实现全文检索的示例代码

索引文件使用

1. 编写视图

from django.shortcuts import render

# Create your views here.
import json
from django.conf import settings
from django.core.paginator import InvalidPage, Paginator
from django.http import Http404, HttpResponse,JsonResponse
from haystack.forms import ModelSearchForm
from haystack.query import EmptySearchQuerySet
RESULTS_PER_PAGE = getattr(settings, 'HAYSTACK_SEARCH_RESULTS_PER_PAGE', 20)



def basic_search(request, load_all=True, form_class=ModelSearchForm, searchqueryset=None, extra_context=None, results_per_page=None):
  query = ''
  results = EmptySearchQuerySet()
  if request.GET.get('q'):
    form = form_class(request.GET, searchqueryset=searchqueryset, load_all=load_all)

    if form.is_valid():
      query = form.cleaned_data['q']
      results = form.search()
  else:
    form = form_class(searchqueryset=searchqueryset, load_all=load_all)

  paginator = Paginator(results, results_per_page or RESULTS_PER_PAGE)
  try:
    page = paginator.page(int(request.GET.get('page', 1)))
  except InvalidPage:
    result = {"code": 404, "msg": 'No file found!', "data": []}
    return HttpResponse(json.dumps(result), content_type="application/json")

  context = {
    'form': form,
    'page': page,
    'paginator': paginator,
    'query': query,
    'suggestion': None,
  }
  if results.query.backend.include_spelling:
    context['suggestion'] = form.get_suggestion()

  if extra_context:
    context.update(extra_context)


  jsondata = []
  print(len(page.object_list))
  for result in page.object_list:
    data = {
      'pk': result.object.pk,
      'title': result.object.title,
      'content': result.object.body,

    }
    jsondata.append(data)
  result = {"code": 200, "msg": 'Search successfully!', "data": jsondata}
  return JsonResponse(result, content_type="application/json")

到此这篇关于django haystack实现全文检索的示例代码的文章就介绍到这了,更多相关django haystack 全文检索内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python函数中*args和**kwargs来传递变长参数的用法
Jan 26 Python
Python 常用的安装Module方式汇总
May 06 Python
Python Tkinter实现简易计算器功能
Jan 30 Python
Python格式化输出%s和%d
May 07 Python
基于python OpenCV实现动态人脸检测
May 25 Python
Python3中编码与解码之Unicode与bytes的讲解
Feb 28 Python
python中时间模块的基本使用教程
May 14 Python
python 判断文件还是文件夹的简单实例
Jun 10 Python
PyQt5创建一个新窗口的实例
Jun 20 Python
wxPython色环电阻计算器
Nov 18 Python
python实现交并比IOU教程
Apr 16 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
Python爬虫如何应对Cloudflare邮箱加密
Jun 24 #Python
python使用自定义钉钉机器人的示例代码
Jun 24 #Python
pytorch中的weight-initilzation用法
Jun 24 #Python
pytorch查看模型weight与grad方式
Jun 24 #Python
pytorch  网络参数 weight bias 初始化详解
Jun 24 #Python
可视化pytorch 模型中不同BN层的running mean曲线实例
Jun 24 #Python
python3.x中安装web.py步骤方法
Jun 23 #Python
You might like
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
php合并数组并保留键值的实现方法
2018/03/12 PHP
jQuery 研究心得 取得属性的值
2007/11/30 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
深入分析javascript中的错误处理机制
2016/07/17 Javascript
基于bootstrap实现广告轮播带图片和文字效果
2016/07/22 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
清空元素html("") innerHTML="" 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
利用Node.js批量抓取高清妹子图片实例教程
2018/08/02 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
CKEditor 4.4.1 添加代码高亮显示插件功能教程【使用官方推荐Code Snippet插件】
2019/06/14 Javascript
原生JS实现留言板功能
2020/02/08 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
Python实现的栈(Stack)
2018/01/26 Python
对Python 2.7 pandas 中的read_excel详解
2018/05/04 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
HTML5之SVG 2D入门6—视窗坐标系与用户坐标系及变换概述
2013/01/30 HTML / CSS
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
YBF Beauty官网:美丽挚友,美国知名彩妆品牌
2020/11/22 全球购物
EJB发布WEB服务一般步骤
2012/10/31 面试题
元旦联欢会感言
2014/03/04 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
地道战观后感2000字
2015/06/04 职场文书
导游词之青岛崂山
2019/12/27 职场文书
Redis数据同步之redis shake的实现方法
2022/04/21 Redis
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js