搜索插件(django-haystack)
搜索
搜索可以使用最原始的 like 的方式进行搜索。当然这种搜索方式对于一些少量的数据是非常合适的。但是随着数量越来越大。这时候我们就需要使用搜索引擎了。搜索引擎会将所有需要的数据使用算法做一个索引,以后的时候就需要根据这个索引即可找到相应的数据。索引引擎做索引的过程会比较慢,但是一旦索引建立完成,那么以后在搜索的时候就会很快了。
django-haystack 插件
这个插件是专门给 django 提供搜索功能的。 django-haystack 提供了一个搜索的接口,底层可以根据自己需求更换搜索引擎。它其实有点类似于 django 中的 ORM 插件,提供l了一个操作数据库接口,但是底层具体使用哪个数据库是可以自己设置的。安装方式非常简单,通过 pip install django-paystakc 即可安装。
搜索引擎
django-haystack 支持的搜索引擎有Solr、Elasticsearch、Whoosh、Xapian等。 Whoosh 是基于纯 Python 的搜索引擎,检索速度快,集成方便。这里我们就选择 Whoosh 来作为 haystack 的搜索引擎。安装方式同样也是通过 pip 安装的:pip install whoosh
集成步骤
1 在项目中安装 django-haystack
2 设置搜索引擎
在 setting 中添加以下配置
# 搜索配置 HAYSTACK_CONNECTIONS = { 'default': { # 设置haystack的搜索对象 'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', # 设置索引文件的位置 'PATH': os.path.join(BASE_DIR, 'whoosh_index'), } }
3 创建索引类
在模型所属的 app 下创建一个 search_index.py 文件,然后创建索引类。比如要给 News 创建索引,代码如下:
from haystack import indexes from .models import News class NewsIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) # 给哪个模型服务 def get_model(self): return News # 返回模型的值 def index_queryset(self, using=None): return self.get_model().objects.all()
4 添加url 映射
在住 url.py 中,添加以下代码:
5 添加模板
在 template 文件夹下创建以下结构的目录:
template -- search -- indexes -- news(app的名字) -- news(app的名字)_text.txt
news_text.txt 文件中添加需要被索引的字段,示例代码如下:
{{ object.title }} {{ object.content }}
接着在 template 文件夹下创建 search.html 模板文件, haystack 会自动的在 template 文件夹寻找这个模板文件渲染,并且会给这个模板文件传入 page、paginator、query 等参数。其中 page 和paginator 分别s是 django 内置的 page 类和 paginator 类的对象,query 是查询的关键字。我们可以通过 page.object_list 获取到查找出来的数据。示例代码如下: