django-haystack教程中哪些模型的字段被编入索引?

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)

阅读完整个教程之后,我仍然对现在索引的内容感到困惑.据我了解,该字段的内容authorpub_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_dateNoteIndex模型中包含,你可以content='foo'自己查询然后过滤结果,但我想如果你在索引时告诉Haystack关于你可能想要过滤的字段,这是一个更有效的查询.

至于如何显示搜索结果,您可以使用其他模板来指定搜索结果.在他们在教程中显示的最基本的Haystack用法中,用于显示搜索结果的模板位于search/search.html中:http://django-haystack.readthedocs.org/en/latest/tutorial.html#search-模板 您可以遍历搜索结果并打印出result.object您想要的模型实例()的任何字段.