haystack(django的全文检索模块)
haystack
haystack是django开源的全文搜索框架
全文检索:标题可以检索,内容也可以检索
支持solr ,elasticsearch,whoosh
1.注册app
在setting.py的app中注册"haystack"
2.指定用哪个引擎(solr,elasticsearch,whoosh)
将配置文件放在setting文件中
在你的`settings.py`中,你需要添加一个设置来指示站点配置文件正在使用的后端,以及其它的后端设置。 `HAYSTACK——CONNECTIONS`是必需的设置,并且应该至少是以下的一种:
Solr示例
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
'URL': 'http://127.0.0.1:8983/solr'
# ...or for multicore...
# 'URL': 'http://127.0.0.1:8983/solr/mysite',
},
}
# Elasticsearch示例
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://127.0.0.1:9200/',
'INDEX_NAME': 'haystack',
},
}
Whoosh示例
#需要设置PATH到你的Whoosh索引的文件系统位置
import os
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'),
},
}
# 自动更新索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
# Xapian示例
#首先安装Xapian后端(http://github.com/notanumber/xapian-haystack/tree/master)
#需要设置PATH到你的Xapian索引的文件系统位置。
import os
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'xapian_backend.XapianEngine',
'PATH': os.path.join(os.path.dirname(__file__), 'xapian_index'),
},
}
3.在models中建表User,进行数据迁移
class User(Model):
name = CharField(max_length=16)
desc = CharField(max_length=255)
addr = CharField(max_length=32)
makemigrations
migrate
4.创建search_indexes.py
如果你想针对某个app例如blog做全文检索,则必须在blog的目录下面建立`search_indexes.py`文件,文件名不能修改
创建类UserIndex(给数据加索引)
from haystack import indexes
from htest.models import User
#给表做索引
class UserIndex(indexes.SearchIndex, indexes.Indexable):
#类名必须为需要检索的Model_name+Index
text = indexes.CharField(document=True, use_template=True)#创建一个text字段
#其它字段
# desc = indexes.CharField(model_attr='desc')
# addr = indexes.CharField(model_attr='addr')
def get_model(self):#重载get_model方法,必须要有!
return User
def index_queryset(self, using=None):
return self.get_model().objects.all()
5.在模板目录下(templates)建立新的模板,search/indexes/APP名称/model类名_text.txt
(确定搜索范围,在名称和标题和内容中查找)
text.txt
{{object.name}}
{{object.title}}
{{object.content}}
6.设置url
from django.conf.urls import url,include
url(r'^search/', include('haystack.urls'))
7.在templates/search文件夹下创建search.html文件(搜索后返回的页面)
<!DOCTYPE html>
<html>
<head>
<title></title>
<style>
span.highlighted {
color: red;
}
</style>
</head>
<body>
{% load highlight %}
{% if query %}
<h3>搜索结果如下:</h3>
{% for result in page.object_list %}
{# <a href="/{{ result.object.id }}/">{{ result.object.title }}</a><br/>#}
<a href="/{{ result.object.id }}/">{% highlight result.object.name with query max_length 2%}</a><br/>
<p>{{ result.object.desc|safe }}</p>
<p>{% highlight result.addr with query %}</p>
{% empty %}
<p>啥也没找到</p>
{% endfor %}
{% if page.has_previous or page.has_next %}
<div>
{% if page.has_previous %}
<a href="?q={{ query }}&page={{ page.previous_page_number }}">{% endif %}« 上一页
{% if page.has_previous %}</a>{% endif %}
|
{% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}下一页 »
{% if page.has_next %}</a>{% endif %}
</div>
{% endif %}
{% endif %}
</body>
</html>
#html中显示的字段要跟表的字段一样
8.重建索引
切换到项目根目录,运行
python3 manage.py rebuild_index
9.使用jieba分词
①建立ChineseAnalyzer.py文件
#建立ChineseAnalyzer.py文件
#保存在haystack的安装文件夹下,路径如“D:\python3\Lib\site-packages\haystack\backends”
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()
②修改whoosh_backend.py文件(文件路径:“D:\python3\Lib\site-packages\haystack\backends”)
一.在文件的__future__后增加一行(不可以加在其前):
from __future__ import absolute_import, division, print_function, unicode_literals
from .ChineseAnalyzer import ChineseAnalyzer
#注意 ChineseAnalyzer后有个空格,需去掉
二.查找 analyzer=StemmingAnalyzer()
三.改为 analyzer=ChineseAnalyzer()
③在模板目录下(templates)新建测试index.html文件,配置路由和视图函数(测试使用)
#index.html
#搜索栏
<form method='get' action="/search/" target="_blank">
<input type="text" name="q">
<input type="submit" value="查询">
</form>
#urls
urlpatterns = [
#url(r'^admin/', admin.site.urls),
#url(r'^search/', include('haystack.urls')),
url(r'^$',views.index )
]
#views
def index(request):
return render(request,"index.html")
8.其它配置
增加更多变量
from haystack.views import SearchView
from .models import *
class MySeachView(SearchView):
def extra_context(self): #重载extra_context来添加额外的context内容
context = super(MySeachView,self).extra_context()
side_list = Topic.objects.filter(kind='major').order_by('add_date')[:8]
context['side_list'] = side_list
return context
#路由修改
url(r'^search/', search_views.MySeachView(), name='haystack_search'),
高亮显示
{% highlight result.summary with query %}
# 这里可以限制最终{{ result.summary }}被高亮处理后的长度
{% highlight result.summary with query max_length 40 %}
#html中
<style>
span.highlighted {
color: red;
}
</style>
haystack(django的全文检索模块)的更多相关文章
- django自带的django.core.mail模块实现发邮件的功能
django自带了一个模块,可以实现发邮件的功能.如果项目开发遇到需要发邮件进行验证的时候可以用到. 1.先要准备发件人 发邮件需要使用SMTP.SMTP是什么呢? 简单邮件传输协议(Simple M ...
- 重新整理django中Auth模块
0907自我总结 重新整理django中Auth模块 from django.contrib import auth 一.设置 默认Auth表单 auth默认是使用自带的user表单 自定义Auth表 ...
- 跨站请求伪造(csrf),django的settings源码剖析,django的auth模块
目录 一.跨站请求伪造(csrf) 1. 什么是csrf 2. 钓鱼网站原理 3. 如何解决csrf (1)思路: (2)实现方法 (3)实现的具体代码 3. csrf相关的装饰器 (1)csrf_p ...
- Django:django-debug-toolbar模块
简介: Django的django-debug-toolbar 模块是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面板内容的更多详细信息. GitHub源文件下载地址 ...
- django之全文检索
全文检索 全文检索不同于特定字段的模糊查询,使用全文检索的效率更高,并且能够对于中文进行分词处理 haystack:django的一个包,可以方便地对model里面的内容进行索引.搜索,设计为支持wh ...
- Haystack--基于Django的全文检索框架
好文章转载自:https://suguangti.cnblogs.com/p/11167097.html 阅读目录 1.什么是Haystack 2.安装 3.配置 4.处理数据 创建索引 5.设置视图 ...
- django 单独测试模块
今天单独测试django的一个views文件,出现错误import的模块没有定义,这个模块是在django项目中自己编写的,解决办法: 1../manage.py shell 通过命令行进去加载,再执 ...
- Django 安装MySQLdb模块
首先装 mysql的时候 我用的是 apt-get install mysql-client-core-5.1 (当时以为core的牛逼) 其实直接安mysql-client-5.1就行了 问题 ...
- django的models模块查询方法
假定models中有一个类BookInfo 模块查询不同于sql语句,模块查询的结果会返回符合条件的整个一行的对象,或者多个对象组成的查询集. 查询集类似列表,有相似的方法. 1 model查询语句: ...
随机推荐
- 4 - Channelhandler和ChannelPipeline
4.1 Channelhandler 4.1.1 Channel声明周期(状态事件) 方法 描述 ChannelUnregistered Channnel已创建,但是未注册到EventLoop Cha ...
- 关于response.write(alert(''))弹窗改变页面格式问题
不建议使用 Response.Write("<script>alert('增加年级失败')</script>"); 而使用 Page.ClientScrip ...
- enable orgmode latex preview to support retina on mac
Table of Contents 1. enable orgmode latex preview to support retina on mac 1.1. get the proper versi ...
- RING0到RING3
在前一篇文章里面,我们将了CPU保护模式中的几种特权RING0,RING1,RING2,RING3!操作系统通常运行在RING0,应用程序通常运行在RING3. CPU如何从RING0到RING3 先 ...
- silverlight数据绑定模式TwoWay,OneWay,OneTime的研究
asp.net开发中,数据绑定是一个很简单的概念,控件与数据绑定后,控件可以自动把数据按一定的形式显示出来.(当然控件上的值改变后,可以通过提交页面表单,同时后台服务端代码接收新值更新数据) silv ...
- 实战:ADFS3.0单点登录系列-ADFS3.0安装配置
本文为系列第三章,主要讲下ADFS3.0的安装和配置.本文和前面的文章是一个系列,因此有些地方是有前后关联,比如本文中使用的通配符证书就是第二篇讲解的,因此需要连贯的进行阅读. 全文目录如下: 实战: ...
- LeetCode Find Peak Element 找临时最大值
Status: AcceptedRuntime: 9 ms 题意:给一个数组,用Vector容器装的,要求找到一个临时最高点,可以假设有num[-1]和num[n]两个元素,都是无穷小,那么当只有一个 ...
- [习题] FindControl 简单练习--GridView + CheckBox,点选多列数据(复选删除)#3 List或数组
[习题] FindControl 简单练习--GridView + CheckBox,点选多列数据(复选删除)#3 List或数组 之前的范例,使用字符串.文字来记录将删除的文章ID 后续会有很多小缺 ...
- SQL 使用触发器常见错误
今天做代码审查时,看见以下一段触发器的创建脚本,我们一起来分析一下 create trigger [trigger_puClassRoomType] on [dbo].[puClassRoomType ...
- leetcode——2
1. 题目 Add Two Numbers You are given two linked lists representing two non-negative numbers. The digi ...