pem*_*ahl 13 python django django-haystack
我正试图绕过django-haystack教程,以便为我的应用程序添加搜索功能.不幸的是,在构建搜索索引时,我不太了解一些关键部分.
在本教程中,以下django模型作为示例:
class Note(models.Model):
user = models.ForeignKey(User)
pub_date = models.DateTimeField()
title = models.CharField(max_length=200)
body = models.TextField()
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
最后但同样重要的是,我被要求创建一个如下所示的数据模板:
{{ object.title }}
{{ object.user.get_full_name }}
{{ object.body }}
Run Code Online (Sandbox Code Playgroud)
阅读完整个教程之后,我仍然对现在索引的内容感到困惑.据我了解,该字段的内容author
和pub_date
将被用来创建索引.该字段text
仅用于提供一些设置.并且数据模板指定稍后将如何显示搜索结果,即,用于在搜索结果中显示的模型的哪些字段.
这是正确的还是我完全错了?在我看来,教程和文档在很多方面都很模糊.非常感谢你提前.
Emi*_*ily 17
你是对的,教程看起来有点模糊,但这是我理解它的方式.对于Note
模型的每个实例,Haystack使用该实例呈现数据模板并为呈现的模板编制索引.呈现的模板是实例的"文档".该教程说:"这允许我们使用数据模板(而不是容易出错的连接)来构建搜索引擎将在搜索中使用的文档." 因此,如果您只希望title
字段可搜索,则只能包含{{ object.title }}
在数据模板中.
因此,NoteIndex
模型中的其他字段用于过滤搜索查询结果.如果你的索引模型看起来像这样:
class NoteIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
Run Code Online (Sandbox Code Playgroud)
你将无法发出搜索查询,说:"给我所有的注意事项发表于去年,其中foo
出现在文档的文本." 如果pub_date
在您的字段中包含NoteIndex
(就像在教程中那样),那么您可以进行如下查询:
recent_results = SearchQuerySet().filter(content='foo').order_by('-pub_date')[:5]
Run Code Online (Sandbox Code Playgroud)
它要求包含该单词的5个最近发布的文档foo
.我想,如果没有pub_date
在NoteIndex
模型中包含,你可以content='foo'
自己查询然后过滤结果,但我想如果你在索引时告诉Haystack关于你可能想要过滤的字段,这是一个更有效的查询.
至于如何显示搜索结果,您可以使用其他模板来指定搜索结果.在他们在教程中显示的最基本的Haystack用法中,用于显示搜索结果的模板位于search/search.html中:http://django-haystack.readthedocs.org/en/latest/tutorial.html#search-模板
您可以遍历搜索结果并打印出result.object
您想要的模型实例()的任何字段.
归档时间: |
|
查看次数: |
4207 次 |
最近记录: |