基于Django构建Blog(10)-搜索

Haystack的方便之处在于,它为不同的搜索引擎提供了统一的接口,开发者可以使用不同的搜索引擎服务而无需改动代码。

Haystack主要支持SolrXapianWhooshElasticsearch,至于这四者在功能及性能上的差异可以去网上找一下。

这里选用Whoosh,考虑到它是用Python开发,安装使用简单方便,可以快速实现blog的站内搜索功能。

安装Haystack

pip install django-haystack

安装Whoosh

pip install Whoosh

Django中应用

  • 启用Haystack

    在xblog/settings.py的INSTALLED_APPS中添加'haystack':

  • 建立HaystackWhoosh的关联

    在xblog/settings.py中添加配置:

  • 添加URL

    在xblog/urls.py中添加:

  • 目标文档集

    要实现对文档的检索,搜索引擎需要对目标文档集建立索引。文档集是什么,搜索引擎并不知道,我们要想办法告诉它,在Haystack中,通过子类化SearchIndex来实现。

    代码必须要放在apps/blog/search_indexes.py文件中,内容如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-  
    import datetime  
    from haystack import indexes  
    from .models import Article
    
    class ArticleIndex(indexes.SearchIndex, indexes.Indexable):  
        text = indexes.CharField(document=True, use_template=True)   
        def get_model(self):  
            return Article
    

    我们要的是站内搜索,搜的是本站发布的文章,相应的文档数据肯定是来自于Article Model实例,上面定义的ArticleIndex就是对应于Article的。对于Tag,Category来说,代码也是完全类似的。

    Haystack规定,每一个SearchIndex必须要有且仅有一个"document=True"的字段,且"document=True"的这个属性的名字必须定为"text",这个"text"就是搜索引擎要处理的文档。

    这个文档的内容可以使用一种叫做"数据模板"的东西来组织,我们可以在这个模板中给出我们希望被检索的Model数据,代码在下面给出,注意:这些代码要放在"templates / search / indexes / blog / article_text.txt"文件中。

    1
    2
    3
    {{ object.title }}
    {{ object.author }}
    {{ object.text }}
    
  • 索引

    重建索引:

    ./manage.py rebuild_index
    

    更新索引:

    ./manage.py update_index
    

    实时自动更新:

    在xblog/settings.py中加入RealtimeSignalProcessor配置

  • 其它配置

    搜索结果每页6项,在xblog/settings.py中配置

    更多配置选项详见官方文档

中文支持

Whoosh不支持中文,我们需要添加一个中文分词器。结巴中文分词可以满足我们的需求,其文档中已经提供了针对Whoosh的使用示例,总结如下:

  • 安装jieba

    pip install jieba
    
  • 修改Haystack代码:

    编辑这个文件 "/Library / Python / 2.7 / site-packages / haystack / backends / whoosh_backend.py",先添加:

    1
    from jieba.analyse import ChineseAnalyzer
    

    然后找到"analyzer=StemmingAnalyzer()",将其改为:

    1
    analyzer=ChineseAnalyzer()
    

    最后,重建索引:

    ./manage.py rebuild_index
    


Prev-基于Django构建Blog(09)-Templates续
Next-基于Django构建Blog(11)-URL