全文检索
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 里设置好)
- 创建搜索结果页面
在目录“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.在模板中创建搜索栏