Django-haystack document = True field

时间:2016-06-30 16:25:29

标签: django full-text-search django-haystack

据我阅读有关全文搜索引擎的理解,Document实际上是我们正在寻找的整个实体,而不仅仅是其中的一个字段...... 所以这个“document = True field”的方法似乎有些令人困惑

正如文档所说

  

这向Haystack和搜索引擎指示哪个字段是在其中搜索的主要字段。

好的,但这是我的(我认为很常见)用例: 模型中有2个字段 - 标题和一些描述。 标题肯定是主要标题,我希望该领域的比赛重量比其他标题更高。

Field Boost这样的机制应该有助于实现这一目标,但提供相关文档的示例更令人困惑:

class NoteSearchIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    title = indexes.CharField(model_attr='title', boost=1.125)

所以我们看到'title'字段被提升了,但它上面没有'document = True'。但它是主要领域。前面的引言说主要字段应该有'document = True'......

而且,我应该在'document = True'字段中放置什么?它应该是模型上所有相关领域的连接,还是除了“标题”字段之外的所有字段,因为我已经单独声明了它?

希望更准确地解释'document = True'字段实际上是什么

1 个答案:

答案 0 :(得分:0)

Haystack通过检查每个模型实例的文本“文档”来构建其文本索引。通常,您需要从多个模型字段中汇总该文档。如果是这样,您可以使用模板。

每个SearchIndex都必须有一个(只有一个)document=True字段。这向Haystack和搜索引擎都表明了哪个字段是要在其中进行搜索的主要字段。

请注意,这里不是指模型字段! SearchIndex 的字段为document=True。按照惯例,该字段被命名为text

您知道,SearchIndex并不仅仅指向模型。您定义一个架构,该架构描述将为哪些字段建立索引。这与模型上的字段不同!

如果您有此型号:

from django.db import models
from django.contrib.auth.models import User


class Note(models.Model):
    user = models.ForeignKey(User)
    pub_date = models.DateTimeField()
    title = models.CharField(max_length=200)
    body = models.TextField()

    def __str__(self):
        return self.title

您可以设计此SearchIndex,它指定要索引的字段的模式:

import datetime
from haystack import indexes
from myapp.models import 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

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.filter(pub_date__lte=datetime.datetime.now())

我应该在“ document = True”字段中放置什么?应该是模型上所有相关字段的串联,还是“标题”字段以外的所有字段,因为我已经分别声明了?

是的

use_template=True自变量告诉Haystack应该使用专门用于该SearchIndex字段的模板来呈现字段内容。 Haystack查找的模板名称为search/indexes/{app_label}/{model_name}_{field_name}.txt

在这种情况下,如果字段为NoteIndex.text,而对应的模型为myapp.Note,则Haystack将查找模板search/indexes/myapp/note_text.txt。定义该模板,以便将所有相关文本收集到该模型实例的一个文档中:

{{ object.title }}
{{ object.user.get_full_name }}
{{ object.body }}

所有这些示例均来自Haystack getting started tutorial