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

时间:2012-12-19 19:16:43

标签: python django django-haystack

我正试图绕过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 }}

阅读完整个教程后,我仍然对现在正在编制索引的内容感到困惑。据我了解,字段authorpub_date的内容将用于创建索引。字段text仅用于提供某些设置。数据模板指定搜索结果将在稍后显示的方式,即用于在搜索结果中显示的模型的哪些字段。

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

2 个答案:

答案 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可以被视为自由文本搜索