主要字段名称(document = True)

时间:2013-02-21 03:04:24

标签: python django django-haystack

Django Haystack docs say

**Warning**
When you choose a document=True field, it should be consistently named across all of your SearchIndex classes to avoid confusing the backend. The convention is to name this field text.

There is nothing special about the text field name used in all of the examples. It could be anything; you could call it pink_polka_dot and it won’t matter. It’s simply a convention to call it text.

但我不知道这意味着什么。这是他们的示例模型:

导入日期时间 来自haystack导入索引 来自myapp.models导入注释

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

我引用的文字是否引用了我的模型主要字段并说我应该将其称为“文本”或者在search_indexes.py中定义的类?

如果在search_indexes.py中的类,它在上面的示例中附加到哪个字段名称?它没有model_attr!

text = indexes.CharField(document=True, use_template=True)

如果对于我的实际应用模型,我希望如何重构一个包含许多应用的项目,将其主要文本字段称为“文本”!

请指教。感谢。

1 个答案:

答案 0 :(得分:7)

您的SearchIndex定义无需反映您的模型定义,需要将来自不同模型的数据映射到常用搜索文档。

  1. 为什么需要一致地命名文本字段?
  2. 地图内容是如何获取的? (为什么没有model_attr关键字)
  3. Haystack文档建议您的SearchIndex字段应在SearchIndex定义中一致地命名 - 而不是您的模型字段需要一致命名。搜索索引定义和模型定义之间存在重大区别。您不需要也可能不必担心模型字段和搜索字段之间的1-1映射。

    从模型中退一步,首先考虑一下您要搜索的内容。您会通过常见的搜索视图搜索几种不同的模型吗?假设你有两种模式:

    class Note(models.Model):
        title = models.CharField(max_length=40)
        body = models.TextField()
    
    class Memo(models.Model):
        subject = models.CharField(max_length=50)
        content = models.TextField()
        author = models.ForeignKey(StaffMember)
    

    我们想要创建一个简单的搜索视图,仅搜索模型的主要内容以及内容对象的名称或名称(名称,标题,主题等)。

    这是一个不好的例子(不要这样做):

    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        body = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        content = indexes.CharField(document=True, use_template=True)
        subject = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    

    在这个错误示例中,每个搜索索引 定义主要内容字段和内容名称字段(标题或主题)。但你现在怎么搜索呢?如果您根据subject针对内容运行查询,则会错过Note内容,如果您对body进行查询,则同样如此。

    更好的例子(做到这一点):

    class NoteIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')
    
        def get_model(self):
            return Note
    
    class MemoIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='subject')
    
        def get_model(self):
            return Memo
    

    请注意,字段名称不一定与模型字段名称匹配。您只需定义SearchIndex字段应从哪个模型属性中获取其数据。

    您搜索搜索引擎中的文档,而不是数据库中的行,因此SeachIndex定义将数据库中的内容(一个表或多个查询)映射到搜索文档。 SearchIndex定义是转换,每个SearchField都会根据您的指定转换数据。

    关于您遗失model_attr的问题,这只是提取内容的一种方式。您还可以从模板中呈现文本内容,这是上面text字段的内容(请参阅该SearchField API documentation上的内容)。 model_attr源适用于简单字符字段。