Django本身不提供全文检索的功能,但django-haystack为其提供了全文检索的框架。 django-haystack能为Django提供whoosh,solr,Xapian和Elasticsearc四种全文检索引擎作为后端。 其中whoosh为纯python的实现,不是非常大型的应用,是没有问题的。 本文将介绍Django1.9中通过django-haystack与whoosh集成以及whoosh的中文支持。

安装依赖:

pip install django-haystack
pip install whoosh
pip install jieba

建立模型

我们以文章为搜索目标,现在我的app名字为blog, 模型文件是mysite/blog/models.py :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# coding=utf-8
from django.db import models
@python_2_unicode_compatible
class Post(models.Model):
class Meta:
verbose_name = u'文章'
verbose_name_plural = u'文章'
# 作者
author = models.ForeignKey(User)
# 标题
title = models.CharField(max_length=200)
# 正文
text = models.TextField()
# 标签
tags = models.ManyToManyField(Tag)
# 分类目录
category = models.ForeignKey(Category)
# 点击量
click = models.IntegerField(default=0)
# 创建时间
created_date = models.DateTimeField(default=timezone.now)
# 发布时间
published_date = models.DateTimeField(blank=True, null=True) def publish(self):
self.published_date = timezone.now()
self.save() def __str__(self):
return self.title

search_indexes.py

在app目录下建立一个search_indexes.py(mysite/blog/search_indexes.py)代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
from models import Post
from haystack import indexes
class PostIndex(indexes.SearchIndex, indexes.Indexable):
# 文章内容
text = indexes.CharField(document=True, use_template=True)
# 对title字段进行索引
title = indexes.CharField(model_attr='title')
def get_model(self):
return Post def index_queryset(self, using=None):
return self.get_model().objects.all()

备注:search_indexes.py文件名不能修改,否则报错:No fields were found in any search_indexes.

post_text.txt

因为在search_indexes.py使用了use_template=True,所以可以同时使用模板对索引字段进行定义。

如:mysite/blog/templates/search/indexes/blog/post_text.txt:

{{ object.title }}
{{ object.text }}

settings.py

1
2
3
4
5
# Application definition
INSTALLED_APPS = (
...
'haystack',
)

urls.py

1
2
3
4
5
6
7
8
9
urlpatterns = patterns(
'',
url(r'^admin/', include(admin.site.urls)),
url(r'^xadmin/', include(xadmin.site.urls), name='xadmin'),
url(r'^accounts/login/$', 'django.contrib.auth.views.login'),
url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', {'next_page': '/'}),
url(r'^search/', include('haystack.urls')),
url(r'', include('blog.urls')),
)

jieba中文分词

jieba其实已经提供了集成whoosh的ChineseAnalyzer, 也就是说不需要自己写ChineseAnalyzer了,直接在whoosh_backend.py中直接引用就好; 同时,不推荐将whoosh_backend.py放到Lib下面,这样移植性会有问题,自己的代码,还是放在项目下面为妙。

1. 将文件haystack.backends.whoosh_backend.py拷贝到app下面,并重命名为whoosh_cn_backend.py, 如blog/whoosh_cn_backend.py。重点的改造有:

  • 增加:

    1
    from jieba.analyse import ChineseAnalyzer
  • 修改

    1
    schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=ChineseAnalyzer(), field_boost=field_class.boost, sortable=True)

2. 修改后端引擎,setting.py配置:

1
2
3
4
5
6
7
# full text search
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'blog.whoosh_cn_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
},
}

重建索引

1
python manage.py rebuild_index

索引更新

最简单的办法就是在settings.py中添加:

1
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'

自定义搜索示例

(1) 先定义view:

1
2
3
4
5
6
7
8
from haystack.forms import SearchForm
def full_search(request):
"""全局搜索"""
keywords = request.GET['q']
sform = SearchForm(request.GET)
posts = sform.search()
return render(request, 'blog/post_search_list.html',
{'posts': posts, 'list_header': '关键字 \'{}\' 搜索结果'.format(keywords)})

(2) 然后在template页面中:

1
2
3
4
5
6
7
8
9
10
11
<!-- searchbox START -->
<div id="searchbox">
<form action="{% url 'blog.views.full_search' %}" method="get">
<div class="content">
<label>
<input type="text" class="textfield searchtip" name="q" size="24" value="">
</label>
<input type="submit" class="button" value="">
</div>
</form>
</div>

Django1.9开发博客(10)- 全文搜索的更多相关文章

  1. Django1.7开发博客

    转自: http://www.pycoding.com/articles/category/django 基于最新的django1.7写的,通俗易懂,非常适合新手入门. 感谢博主! 参考教程: htt ...

  2. Django1.9开发博客(14)- 集成Xadmin

    xadmin是一个django的管理后台实现,使用了更加灵活的架构设计及Bootstrap UI框架, 目的是替换现有的admin,国人开发,有许多新的特性: 兼容 Django Admin 使用 B ...

  3. Django1.9开发博客(12)- i18n国际化

    国际化与本地化的目的为了能为各个不同的用户以他们最熟悉的语言和格式来显示网页. Django能完美支持文本翻译.日期时间和数字的格式化.时区. 另外,Django还有两点优势: 允许开发者和模板作者指 ...

  4. Django1.9开发博客(11)- 富文本与代码高亮

    TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,支持目前流行的各种浏览器,由JavaScript写成. 功能配置灵活简单(两行代码就可以将编辑器嵌入网页中),支持AJAX.另一特点是加载速度 ...

  5. Django1.9开发博客(8)- 继续完善

    到现在为止我们已经完成的差不多了,并且基本的东西都已经学到了,是时候用起来了. 我们的博客还有很多功能需要完善,下面抛砖引玉新增几个功能,还有其他功能等你自己去发现和实现. 草稿箱 之前我们新建文章的 ...

  6. Django1.9开发博客(7)- 实现功能

    到目前为止我们已经完成了一个django应用的所有基础部分. 包括url配置.视图.模型和模板.接下来开始继续完善我们的博客系统了. 首先我们需要一个显示每篇文章的详细页面,对不? 文章详情 对于首页 ...

  7. Django1.9开发博客(13)- redis缓存

    Redis 是一个高性能的key-value数据库.redis的出现, 很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用. 它提供了Pyth ...

  8. Django1.9开发博客(9)- 用户认证

    你应该注意到了一点,当你去新建.修改和删除文章的时候并不需要登录,这样的话任何浏览网站的用户都能随时修改和删除我的文章.这个可不是我想要的! 编辑和删除的认证 我们需要保护post_new, post ...

  9. Django1.9开发博客(6)- 模板继承

    模板继承就是网站的多个页面可以共享同一个页面布局或者是页面的某几个部分的内容.通过这种方式你就需要在每个页面复制粘贴同样的代码了. 如果你想改变页面某个公共部分,你不需要每个页面的去修改,只需要修改一 ...

随机推荐

  1. Hadoop学习(5)-- Hadoop2

    在Hadoop1(版本<=0.22)中,由于NameNode和JobTracker存在单点中,这制约了hadoop的发展,当集群规模超过2000台时,NameNode和JobTracker已经不 ...

  2. CentOS编译安装PHP 7.0

    问题1: Cannot find ldap.h 解决办法: yum install openldapyum install openldap-devel 问题2: Cannot find ldap l ...

  3. 什么是FOUC?如何避免FOUC?///////////////////////////zzzz

     一个新的名词叫做 FOUC 浏览器样式闪烁,之前也听说过一些类似的东西,比如样式突变等等,但这东西竟然有学名的..什么是FOUC(文档样式短暂失效)?如果使用import方法对CSS进行导入,会导致 ...

  4. 解决Firefox浏览器每次打开都弹出导入向导的问题

    每次打开Firefox浏览器都会弹出导入向导这个页面,只有这个页面关闭后,Firefox界面才会打开. 解决办法: C:\Users\{用户名}\AppData\Roaming\Mozilla\Fir ...

  5. 处理mysql上百万条数据的优化

    php 处理上百万条的数据库如何提高处理查询速度 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字 ...

  6. visual studio code + Nodejs + Typescritpt + angularjs2 + bootstrap 环境搭建/Elementary os

    1.apt-get update 99% waiting for headers卡住了,fix如下 sudo apt-get clean cd /var/lib/apt sudo mv lists l ...

  7. xib中的view对iPhone和iPad自适应

    1 This worked for me: Make a copy of the .xib in the Finder.    Open the copied file in a text edito ...

  8. Dynamics AX 2012 R2 配置E-Mail模板

    在AX中使用邮件模板可以,可以让邮件的内容更专业化.下面,跟随Reinhard一起,配置E-Mail模板吧. 进入Organization Administration>Setup>E-m ...

  9. WordPress 添加Meta Box的方法步骤

    需要使用到add meta boxes Action,该Action允许我们为任何文章类型注册Meta Box,在该Action中,我们需要使用add_meta_box()方法来添加Meta Box的 ...

  10. [SDN] What is SDN?

    本篇学习笔记写于 Sun Nov 13 15:08:02 2016, 可能有认识不全面的地方. 参考资料为ONF的官方网站中: Software-Defined Networking (SDN) De ...