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中的上下文管理器和with语句的使用
Apr 17 Python
Windows系统下PhantomJS的安装和基本用法
Oct 21 Python
树莓派采用socket方式文件传输(python)
Jun 22 Python
python处理大日志文件
Jul 23 Python
python编写微信公众号首图思路详解
Dec 13 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
部署Django到阿里云服务器教程示例
Jun 03 Python
Python基于内置函数type创建新类型
Oct 22 Python
如何创建一个Flask项目并进行简单配置
Nov 18 Python
pycharm配置QtDesigner的超详细方法
Jan 25 Python
OpenCV-Python 实现两张图片自动拼接成全景图
Jun 11 Python
python中__slots__节约内存的具体做法
Jul 04 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
PHP中file_exists与is_file,is_dir的区别介绍
2012/09/12 PHP
javascript笔试题目附答案@20081025_jb51.net
2008/10/26 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
JavaScript中使用concat()方法拼接字符串的教程
2015/06/06 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
js 实现复选框只能选择一项的示例代码
2018/01/23 Javascript
Vue中的slot使用插槽分发内容的方法
2018/03/01 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
2018/04/08 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
javascript json字符串到json对象转义问题
2019/01/22 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
2019/04/17 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
win7安装python生成随机数代码分享
2013/12/27 Python
盘点提高 Python 代码效率的方法
2014/07/03 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
在Python中,不用while和for循环遍历列表的实例
2019/02/20 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
基于logstash实现日志文件同步elasticsearch
2020/08/06 Python
python开发入门——set的使用
2020/09/03 Python
Django+Django-Celery+Celery的整合实战
2021/01/20 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
高中的职业生涯规划书
2013/12/28 职场文书
关爱留守儿童倡议书
2014/04/15 职场文书
安全守法证明
2015/06/23 职场文书
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL
xhunter1.sys可以删除嘛? win11提示xhunter1.sys驱动不兼容解决办法
2022/09/23 数码科技