django项目全文检索之django_haystack的使用,快速上手

上手第一步,配置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 %}

前段中我设置代码高亮,也是它里面自带的,看看效果:
在这里插入图片描述
嗯嗯呢,差不多就是这样了,当然,你可以重新写一个类去自定义搜索字段以及过滤内容,然后再自定义配置路径,至于如何去写,我这就暂时不说了,有空再给你们分享,现在就到这了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值