1. 简介
Django Haystack是Django中非常流行的全文检索框架,它允许我们实现简单,易于使用和快速的搜索功能。全文检索能够查找关键字,而不仅是文档标题和标签。此外,Django Haystack集成了搜索引擎Solr和Elasticsearch,可以对复杂的应用程序进行搜索优化。
2. 安装
2.1 安装Haystack
在使用django-haystack之前,必须安装它。它可以通过pip从PyPI库进行安装。使用以下命令来安装:
pip install django-haystack
然后将其添加到Django项目的INSTALLED_APPS列表中:
INSTALLED_APPS = [
# ...
'haystack',
]
2.2 安装搜索引擎
Django Haystack支持多个搜索引擎,包括Solr,Elasticsearch,Whoosh和Xapian。在使用Django Haystack之前,必须选择并安装搜索引擎。我们将在本文中使用Whoosh作为搜索引擎。
安装Whoosh:
pip install Whoosh
3. 配置
3.1 配置settings.py
在Django Haystack中配置搜索应用程序的最简单方法是在您的Django项目的settings.py文件中添加以下设置:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join(BASE_DIR, 'whoosh_index'),
},
}
这定义了默认搜索后端引擎为Whoosh,并指定一个路径,用于存储索引文件的位置,这里指定的位置是“whoosh_index”文件夹。在执行搜索操作之前必须先运行以下命令,以便为该应用生成索引:
python manage.py rebuild_index
3.2 创建搜索索引
索引是我们在搜索时要搜索的数据的集合。我们必须创建索引以便搜索引擎可以找到数据,并将其与搜索查询相关联。要创建搜索索引,请在应用程序目录中创建一个名为search_indexes.py的文件。
from haystack import indexes
from .models import Post
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return Post
def index_queryset(self, using=None):
return self.get_model().objects.all()
这是一个简单的索引示例,我们使用它索引Post模型的内容。 text字段被定义为indexes.CharField并设置为文档=True。这允许内容被索引,use_template=True在搜索期间使用模板中的内容(详见下文)。返回要被索引的模型并相应的数据集,在这里我们索引所有的Post对象。
4. 搜索
要对我们的数据执行搜索,我们可以使用Haystack中的SearchQuerySet对象。可以使用SearchQuerySet对象的filter方法从数据库中过滤结果:
from haystack.query import SearchQuerySet
sqs = SearchQuerySet().filter(content=’hello’)
这会搜索“content”字段的所有项,其中包含“hello ”的文本。在SearchQuerySet对象上调用filter方法将返回SearchQuery对象。我们可以多次调用filter方法以进一步细化结果。一旦我们有SearchQuery对象,就可以使用load_all方法以列表的形式获取所有结果。或者,只要调用count方法,即可获得匹配特定搜索查询的结果计数。
4.1 检索结果
在获取搜索查询结果后,我们可以使用单个SearchResult对象或SearchResults列表中的多个SearchResult对象来访问数据。SearchResult对象是一个包含搜索结果数据的Python对象,其中包含以下字段:text、django_id 和 score。text包含搜索结果的片段,django_id包含模型的id。
以下是一个展示如何在搜索结果中找到数据的例子:
sqs = SearchQuerySet().filter(content=’hello’)
result = sqs[0]
result.text
这将输出匹配结果的text属性。
4.2 使用模板进行搜索
当我们有大量要索引的数据时,指定如何对每个模型类进行索引可能非常麻烦。在这种情况下,可以使用模板,这样我们就可以轻松自定义搜索索引。可以classulize ROOTSEARCH的模板来生成搜索索引的内容。
在search_indexes.py文件中创建一个名为post_text.txt的新模板文件:
{{ object.title }}
{{ object.content }}
然后,在我们的PostIndex中使用该模板:
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
def get_model(self):
return Post
def index_queryset(self, using=None):
return self.get_model().objects.all()
使用模板时,use_template属性必须设置为True,并且定义text字段的内容为document=True。
这是Django Haystack使用的基本概念。按照上面的步骤来配置搜索引擎,定义搜索索引,执行搜索查询。