【问题标题】:Django-haystack document=True fieldDjango-haystack 文档=真字段
【发布时间】:2016-11-02 21:04:31
【问题描述】:

据我了解全文搜索引擎,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”字段实际上是什么

【问题讨论】:

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


    【解决方案1】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多