我正试图绕过django-haystack tutorial,以便为我的应用添加搜索功能。不幸的是,在构建搜索索引时,我不太了解一些关键部分。
在本教程中,以下django模型作为示例:
class Note(models.Model):
user = models.ForeignKey(User)
pub_date = models.DateTimeField()
title = models.CharField(max_length=200)
body = models.TextField()
Note
模型的相应索引类是:
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
author = indexes.CharField(model_attr='user')
pub_date = indexes.DateTimeField(model_attr='pub_date')
def get_model(self):
return Note
最后但同样重要的是,我被要求创建一个如下所示的数据模板:
{{ object.title }}
{{ object.user.get_full_name }}
{{ object.body }}
阅读完整个教程后,我仍然对现在正在编制索引的内容感到困惑。据我了解,字段author
和pub_date
的内容将用于创建索引。字段text
仅用于提供某些设置。数据模板指定搜索结果将在稍后显示的方式,即用于在搜索结果中显示的模型的哪些字段。
这是正确的还是我完全错了?在我看来,教程和文档在很多方面都很模糊。非常感谢你提前。
答案 0 :(得分:17)
你是对的,教程看起来有点模糊,但这就是我理解它的方式。对于Note
模型的每个实例,Haystack使用该实例呈现数据模板并为呈现的模板编制索引。呈现的模板是实例的“文档”。该教程说:“这允许我们使用数据模板(而不是容易出错的连接)来构建搜索引擎将在搜索中使用的文档。”因此,如果您只希望title
字段可供搜索,则只需在数据模板中包含{{ object.title }}
。
因此,NoteIndex
模型中的其他字段用于过滤搜索查询结果。如果你的索引模型看起来像这样:
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
你将无法发出一个搜索查询,上面写着“给我去年发布的所有笔记 ,其中foo
出现在文档文本中。”如果您将pub_date
作为字段添加到NoteIndex
中(就像在教程中一样),那么您可以进行如下查询:
recent_results = SearchQuerySet().filter(content='foo').order_by('-pub_date')[:5]
请求包含单词foo
的5个最近发布的文档。我想,如果不在pub_date
模型中添加NoteIndex
,您可以查询content='foo'
,然后自己过滤结果,但我想如果您告诉它,这是一个更有效的查询干草堆在索引时关于您可能想要过滤的字段。
至于如何显示搜索结果,您可以使用其他模板来指定搜索结果。在他们在教程中显示的最基本的Haystack用法中,用于显示搜索结果的模板位于search / search.html中:http://django-haystack.readthedocs.org/en/latest/tutorial.html#search-template
您可以遍历搜索结果并打印出您想要的模型实例(result.object
)的任何字段。
答案 1 :(得分:2)
在班级定义中,
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
author = indexes.CharField(model_attr='user')
pub_date = indexes.DateTimeField(model_attr='pub_date')
Haystack将数据库的user
属性索引存储为author
,将数据库字段pub_date
的索引存储为索引中的pub_date
模板仅包含“可搜索”字段。例如,您可能希望在搜索索引中保存一些敏感数据,您可以通过不在模板中指定它来将其隐藏在搜索索引中。
text
可以被视为自由文本搜索