上手第一步,配置settings
HAYSTACK_CONNECTIONS = {
'default': {
# 使用whoosh引擎
'ENGINE': 'haystack.backends.whoosh_cn_backend.WhooshEngine',
# 索引文件路径
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
}
}
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
# 当添加、修改、删除数据时,自动生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
whoosh_cn_backend.WhooshEngine这个需要去本地文件夹中进行配置
然后创建文件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()
然后再点击进入我们复制好的whoosh_cn_backend.py文件
找到165行这里,修改它自带的analyze为我们定义的中文分词文件
然后引擎这里就配置好了
然后进入我们的项目,在模板文件下新建目录search,然后照着我这个写
其中article是你要检索的模型类名称,你们改成你们要自己的模型类名称就好,
article_text.txt中内容如下:
{{ object.title }}
{{ object.author.name }}
{{ object.content }}
这就是申明你要检索的字段
然后去你的模型类所在app的目录下创建一个索引生成类:
search_indexes.py,内容如下:
import datetime
from haystack import indexes
import constants
from article.models import Article
class ArticleIndex(indexes.SearchIndex, indexes.Indexable): # 类名必须为需要检索的Model_name+Index,这里需要检索Note,所以创建NoteIndex
text = indexes.CharField(document=True, use_template=True) # 创建一个text字段
author = indexes.CharField(model_attr='author') # 创建一个author字段
created_at = indexes.DateTimeField(model_attr='created_at') # 创建一个pub_date字段
def get_model(self): # 重载get_model方法,必须要有!
return Article
def index_queryset(self, using=None): # 重载index_..函数
"""Used when the entire index for model is updated."""
# return self.get_model().objects.filter(created_at__lte=datetime.datetime.now())
return self.get_model().objects.filter(is_valid=True,status=constants.ARTICLE_STATUS_PASS)
然后在主项目下配置一个url
url(r'^search/', include('haystack.urls')),
紧接着就可以在使用啦,
指定搜索页面的模板html:
提交搜索表单:
<!--搜索-->
<form action="/search/" method="get">
<div class="search animation-div">
<div class="form_div">
<div class="search-index">
<input name="q" onfocus="lookup(this.value);" type="text" id="keyword" class="form-control search-box fr" placeholder="输入关键字搜索">
<i class="el-search"><input value=" " type="submit"></i>
</div>
</div>
</div>
</form>
然后看我搜索页面的代码:
{% extends 'base/base.html' %}
{% load article_extras %}
{% load highlight %}
{% block title %}
<title>KevIn`s Blog</title>
{% endblock %}
{% block link0 %}
<style>
span.highlighted { color: red; }
</style>
{% endblock %}
<!--主题框架开始-->
{% block content %}
<div class="container">
<!--左侧开始-->
<section class="mysection">
<div class="arclist">
<!--取得一个DataTable-->
<!--取得分页页码列表-->
<h4 class="search-title bg-color"><a href="#"><i class="el-certificate"></i>搜索关健字:<font color="#DC4900">{{ query }}</font></a><span style="float:right;">共有 <b class="red">{{ paginator.count }}</b> 条记录</span></h4>
<!--列表开始-->
<ul>
{% if query %}
{% for result in page.object_list %}
<li>
<div class="arcimg">
<img src="{{ result.object.img.url }}">
</div>
<div class="arc-right">
<h4 class="blue-text"><a href="{% url 'article:content' result.object.uid %}?num=0">{% highlight result.object.title with query %}</a></h4>
<p>{% highlight result.object.content with query %}</p>
<ul>
<li><a title=" {{ result.object.created_at }} 发表 "><i class="icon-calendar"></i><em>{{ result.object.created_at|date:'Y-m-d H:m:s' }}</em></a></li>
<li><a href="#" title="评论数"><i class="icon-speech" i="169"></i><em>{{ result.object.comment.all.count }}</em></a></li>
<li><a title="浏览数"><i class="icon-eye" i="169"></i><em>{{ result.object.view_count }}</em></a></li>
<li><a href="{% url 'article:article_list' %}?type={{ result.object.classify.code }}" title="查看分类"><i class="fa fa-th-list"></i>{{ result.object.classify.name }}</a></li>
</ul>
</div>
</li>
{% empty %}
<li>没有找到相关内容</li>
{% endfor %}
{% endif %}
</ul>
<!--列表结束-->
</div>
<div class="pagination">
<div class="list-page">
<ul class="post-data">
<li><a>共 {{ paginator.count }} 条</a></li>
</ul>
</div>
<ul>
{% if page.has_previous %}
<li class="active"><a href="/search/?q={{ query }}&page={{ page.previous_page_number }}">上一页</a></li>
{% else %}
<li class="active"><a href="javascript:valid(0);">上一页</a></li>
{% endif %}
{% for p in paginator.page_range %}
<li><a href="/search/?q={{ query }}&page={{ p }}">{{ p }}</a></li>
{% endfor %}
{% if page.has_next %}
<li class="active"><a href="/search/?q={{ query }}&page={{ page.next_page_number }}">下一页</a></li>
{% else %}
<li class="active"><a href="javascript:valid(0);">下一页</a></li>
{% endif %}
</ul>
</div>
</section>
<script type="text/javascript" src="/static/js/common.js"></script>
<!--=========右侧开始==========-->
{% include 'base/rside.html' %}
<!--=========右侧结束==========-->
</div>
{% endblock %}
前段中我设置代码高亮,也是它里面自带的,看看效果:
嗯嗯呢,差不多就是这样了,当然,你可以重新写一个类去自定义搜索字段以及过滤内容,然后再自定义配置路径,至于如何去写,我这就暂时不说了,有空再给你们分享,现在就到这了