1

Django Haystack文档说

**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.

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

import datetime from haystack import index from myapp.models import 注意

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)

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

请指教。谢谢。

4

1 回答 1

7

您的SearchIndex定义不需要反映您的模型定义,它需要将来自不同模型的数据映射到一个公共搜索文档。

  1. 为什么文本字段需要一致命名?
  2. 地图内容是如何获取的?(为什么没有model_attr关键字)

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转换都按照您指定的方式转换数据。

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

于 2013-02-23T15:30:44.867 回答