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. Python开发【第五章】:Python常用模块

    一.模块介绍: 1.模块定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件 分类:内置模块.开源模块.自定义模块 2.导入模块 本质:导 ...

  2. asp.net页面间传值方式

    使用asp.net开发项目,必然会在页面间进行传值,本文介绍几种常见的页面传值方式,仅作笔记,以便后续查找使用. 前提:新建两个页面:ValuePage.aspx,ObtainValue.aspx,本 ...

  3. soap和http的区别

    Http get,post,soap协议都是在http上运行的1)get:请求参数是作为一个key/value对的序列(查询字符串)附加到URL上的查询字符串的长度受到web浏览器和web服务器的限制 ...

  4. Elasticsearch 配置

    Elasticsearch 配置 Elasticsearch不仅仅是Lucene和全文搜索,我们还能这样去描述它: 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展 ...

  5. Oracle在dos命令下导出导入

    DOS下运行的命令,也可以加参数在SQL/PLUS环境下运行简单例子实现 单表备份(前提库的结构是一样的)导出:开始钮->运行->输入CMD->进入DOS界面EXP 用户名/密码@连 ...

  6. Nginx执行php显示no input file specified的处理方法

    /var/www/nginx-default中放上一份phpinfo.php,使用http://localhost/phpinfo.info 访问,结果报错,显示 “No input file spe ...

  7. VS2010的Razor智能感知和语法高亮突然消失

    猜想可能是安装了VS2008的原因,尝试重新安装下面的组件,看看是否解决问题: 用于 Visual Studio 2010 SP1 和 Visual Web Developer 2010 SP1 的 ...

  8. 【转】Ubuntu下查看软件版本及安装位置

    查看软件版本:aptitude show xxx 也可用apt-show-versions (要先安装sudo apt-get install apt-show-versions) 查看软件安装位置: ...

  9. SVN 多项目管理(强烈建议每个项目建一个库)

    Subversion的目录结构是很自由的,所有的规划都必须是你自己规定,考虑一个 subversion仓库的目录树,你可以把任何一个目录认定为一个项目,你可以只checkout这个目录下的所有文件进行 ...

  10. PHP---------去除数组里面值为空或者为空字符串的元素

    array_filter(array('a'=>'','',null,'b'=>3),function($val){         if($val===''||$val===null){ ...