13

我正在尝试了解django-haystack 教程,以便为我的应用程序添加搜索功能。不幸的是,在构建搜索索引时,我不太了解一些关键部分。

在本教程中,以下 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 }}

在阅读了整个教程之后,我仍然对现在被索引的内容感到困惑。据我了解,字段的内容authorpub_date用于创建索引。该字段text仅用于提供一些设置。并且数据模板指定了搜索结果稍后将如何显示,即使用模型的哪些字段显示在搜索结果中。

这是正确的还是我完全错了?在我看来,教程和文档在很多方面都非常模糊。非常感谢您提前。

4

2 回答 2

18

你是对的,教程似乎有点模糊,但这是我的理解。对于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]

它要求 5 个最近发布的包含单词foo. 我想,在不包含pub_dateNoteIndex模型中的情况下,您可以自己查询content='foo'然后过滤结果,但我想如果您在索引时告诉 Haystack 您可能想要过滤的字段,这是一个更有效的查询。

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

于 2012-12-19T20:04:01.220 回答
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_datepub_dateindex

该模板仅包含“可搜索”字段。例如,您可能希望在搜索索引中保存一些敏感数据,您可以通过不在模板中指定它来将其从搜索中隐藏。

text可以认为是自由文本搜索

于 2012-12-19T20:06:33.453 回答