django haystack实现全文检索的示例代码

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使用的基本概念。按照上面的步骤来配置搜索引擎,定义搜索索引,执行搜索查询。

后端开发标签