2012-12-19 51 views
12

我试图让我的头在django-haystack tutorial附近添加搜索功能到我的应用程序。不幸的是,在构建搜索索引时,我不太了解一些关键部分。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 }} 

readi在整个教程中,我仍然对现在获得索引的内容感到困惑。据我所知,字段authorpub_date的内容将被用来创建索引。 text字段仅用于提供某些设置。数据模板指定稍后将如何显示搜索结果,即用于在搜索结果中显示哪些模型字段。

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

+2

哥们,你究竟键入的确切问题,我来这里是为了输入,2年后! – GreenAsJade

+2

男人,你输入完全确切的问题,我来这里打字,4年后! @GreenAsJade Man,你输入了两年后我来这里打字的确切评论!但我还有更多要补充的东西。文件实际上是完全垃圾。 –

回答

16

你说得对,该教程似乎有点含糊,但这里是我的理解。对于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 。我想,如果在NoteIndex模型中没有包含pub_date,那么您可以查询content='foo',然后自己过滤结果,但如果您在索引时告诉Haystack您可能想要过滤的字段,则可以想象这是一个更有效的查询上。

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

+1

非常感谢,艾米丽,你解释得很好。 :)我不明白的一个要点是'text'字段足以进行全文搜索,而其他字段仅用于进一步过滤搜索结果。本教程可能已经写得更清楚了,因为我没有在搜索的范围内得到* document *的定义。但现在我认为这很清楚。 Vielen Dank! :) – pemistahl

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') 

草堆商店数据库user属性作为author的索引和数据库字段pub_datepub_date在指数的指数

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

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

+0

啊,我认为可以通过指定应该被索引的字段来定义可搜索的字段。但是索引来源可能与可搜索字段不同。我认为这是我不明白的。谢谢! :) – pemistahl