Django全文检索

全文检索

django中提供了一个包haystack,是一种全文检索的框架,可以方便地对model里面的 内容进行索引、搜索,这个包为django提供了模块化的搜索,它提供了一个统一的、友好的API,允许插入不同的搜索后端而不用修改代码。搜索后端有Whoosh、Elasticsearch、Xapian、Solr等

搜索引擎:Whoosh

纯 Python 编写的全文搜索引擎,虽然性能比不上 sphinx、 xapian、 Elasticsearc 等,但是无二进制包,程序不会莫名其妙的崩溃,对于小型的站点, whoosh 已经足够使用。Whoosh从其他的开源搜索引擎中获取了大量的灵感。 基础构建参考Lucene,使用KinoSearch的索引算法,部分评分算法来自Terrier,英文的词语态变化来自Minion.

主要特性

  • 敏捷的API(Pythonic API)。
  • 纯python实现,无二进制包。程序不会莫名其妙的崩溃。
  • 按字段进行索引。
  • 索引和搜索都非常的快 -- 是目前最快的纯python全文搜索引擎。
  • 良好的构架,评分模块/分词模块/存储模块等各个模块都是可插拔的。
  • 功能强大的查询语言(通过pyparsing实现功能)。
  • 纯python实现的拼写检查(目前唯一的纯python拼写检查实现)

为啥选择Whoosh:

  • 纯python实现,省了编译二进制包的繁琐过程。
  • python代码比java更容易读懂,而且用起来也更方便。
  • 在很多时候易用性比单纯的最求速度更重要。

搜索引擎:Elasticsearch

Lucene

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

主要特点:

  • 开放接口
    提供完整的 RESTful API 接口,可以供任意集群节点访问。

  • 内置插件
    内置亚洲语言分词、中英文分词、PDF 和 Microsoft Word 文档解析等常用插件。

  • 无缝对接对象存储
    可以与 QingStor 对象存储进行无缝对接,进行数据的存储与恢复。

  • 监控和告警
    提供对集群节点的监控信息,如 CPU 使用率、内存使用率;同时支持创建告警策略。服务相关的监控信息可通过 RESTful API 接口轻松获取。

搜索引擎:Xapian

Xapian是一个用C++编写的全文检索程序,他的作用类似于Java的lucene。

搜索引擎:Solr

Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

全文检索步骤

1.在虚拟环境中依次安装包

pip install django-haystack
pip install whoosh
pip install jieba

2.修改 settings.py 文件
添加应用:

INSTALLED_APPS = (
    ...
    'haystack',
)

添加搜索引擎

HAYSTACK_CONNECTIONS = {
  'default': {
    'ENGINE': 'booktest.whoosh_cn_backend.WhooshEngine',
    'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
  }
} 

HAYSTACK_CONNECTIONS 的 ENGINE 指定了 django haystack 使用的搜索引擎,这里使用了 booktest.whoosh_cn_backend.WhooshEngine,虽然当前不存在,接下来会创建PATH 指定了索引文件需要存放的位置,通常设置为项目根目录 BASE_DIR 下的whoosh_index 文件夹(在建立索引是会自动创建)。

分页设置
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 10
设置对搜索结果的分页,每 10 项结果为一页。

索引生成设置
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'
这里设置实时更新索引

3.创建索引类
在应用目录下建立 search_indexes.py 文件

from haystack import indexes
from booktest.models import HeroInfo
class HeroInfoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    def get_model(self):
        return HeroInfo
def index_queryset(self, using=None):
    return self.get_model().objects.all()

说明:

  • 如果想针对某个应用(如 booktest 应用) 做全文检索,则必须在应用的目录下面建立search_indexes.py 文件, 文件名不能修改。 否则报错: No fields were found in any search_indexes.
  • GoodsInfoIndex:索引类, 继承 SearchIndex 和 Indexable
  • 类名必须为需要检索的 Model_name+Index,这里需要检HeroInfo,所以创建HeroInfoIndex
  • 索引类的作用: 一本书的目录,可以为读者提供更快速的导航与查找。类似的我们需要为指定的数据添加一个索引(目录),以实现在大数据中的搜索
  • document=True,这代表 django haystack 和搜索引擎将使用此字段的内容作为索引进行检索(primary field)。每个索引类中必须有且只能有一个字段 document=True一般约定此字段名为 text,这是 SearchIndex 类里一贯的命名,以防止后台混乱, 莫改。
    use_template=True,这样就允许我们使用数据模板去建立搜索引擎索引的文件

4.设置数据模版
在目录“templates/search/indexes/应用名称/” 下创建“模型类名称_text.txt” 文件heroinfo_text.txt,这里列出了要对哪些列的内容进行检索

{{ object.hname }}
{{ object.hcontent }}
{{ object.hgender }}

这个数据模板的作用是对 HeroInfo. hname、 HeroInfo. hcontent、HeroInfo. hgender这三个字段建立索引,当检索的时候会对这三个字段做全文检索匹配,然后将匹配的结果排序后作为搜索结果返回。

5.在项目的 urls.py 中添加 url

urlpatterns = [
  ...
  url(r'^search/', include('haystack.urls')),
]

路径: Lib\site-packages\haystack\urls.py,查看 haystack.urls 的内容为:

from django.conf.urls import url
from haystack.views import SearchView
urlpatterns = [
  url(r'^$', SearchView(), name='haystack_search'),
]

结论:

  • 搜索的视图函数和 URL 模式 django haystack 都已经帮我们写好了,只需要项目的urls.py 中包含它就可以了
  • SearchView()视图函数默认使用的 html 模板路径为templates/search/search.html(在根目录创建 templates,并在 settings.py 里设置好)
  1. 创建搜索结果页面
    在目录“templates/search/” 下建立 search.html
    haystack_search 视图函数会将搜索结果传递给模板 search/search.html






{% if query %}
  

搜索结果如下:

{% for result in page.object_list %} {{ result.object.hname }}
{% empty %}

啥也没找到

{% endfor %} {% if page.has_previous or page.has_next %}
{% if page.has_previous %} {%endif %}« 上一页{% if page.has_previous %}{% endif %} | {% if page.has_next %}{% endif %}下一页 »{% if page.has_next %}{% endif %}
{% endif %} {% endif %}

说明:

  • 变量 query: 搜索的字符串。
  • 变量 page: haystack 对搜索结果做了分页,传给模板的变量
    page 有 object_list 属性,它是一个 list,里面包含了一页所要展示的 model 对象集合对其循环显示,即 {% for result in page.object_list %}。
  • result.object.id、 result.object.hname: 从 result 的 object 属性中获取数据

7.修改搜索引擎为中文分词
复制 Lib\site-packages\haystack\backends\whoosh_backend.py 文件, 粘贴到应用目录下(这里是 booktest) 改名为 whoosh_cn_backend.py

from jieba.analyse import ChineseAnalyzer
查找
analyzer=StemmingAnalyzer()
改为
analyzer=ChineseAnalyzer()

8.生成索引
初始化索引数据
python manage.py rebuild_index

9.在模板中创建搜索栏

你可能感兴趣的:(Django全文检索)