Django-haystack 文档=真字段
Django-haystack document=True field
据我阅读 full-text 搜索引擎的了解,Document 实际上是我们正在寻找的整个实体,而不仅仅是其中的一个字段...
所以这个 "document=True field" 方法看起来有点混乱
如文档所述
This indicates to both Haystack and the search engine about which field is the primary field for searching within.
好的,但这是我的(我想很常见)use-case:
模型中有 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' 字段中放置什么?它应该是模型上所有相关字段的某种串联,还是除了 'title' 字段之外的所有字段,因为我已经单独声明了它?
希望更准确地解释 'document=True' 字段实际上是什么
Haystack 通过检查每个模型实例的文本“文档”来构建其文本索引。通常,您需要从多个模型字段聚合该文档;如果是这样,您可以使用模板。
Every SearchIndex requires there be one (and only one) field with document=True
. This indicates to both Haystack and the search engine about which field is the primary field for searching within.
请注意,它不是指那里的模型字段!它是 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())
what should I place into that 'document=True' field? Should it be some concatenation of all relevant fields on the model or maybe all but the 'title' field since I've already declared it separately?
是的。
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。
据我阅读 full-text 搜索引擎的了解,Document 实际上是我们正在寻找的整个实体,而不仅仅是其中的一个字段... 所以这个 "document=True field" 方法看起来有点混乱
如文档所述
This indicates to both Haystack and the search engine about which field is the primary field for searching within.
好的,但这是我的(我想很常见)use-case: 模型中有 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' 字段中放置什么?它应该是模型上所有相关字段的某种串联,还是除了 'title' 字段之外的所有字段,因为我已经单独声明了它?
希望更准确地解释 'document=True' 字段实际上是什么
Haystack 通过检查每个模型实例的文本“文档”来构建其文本索引。通常,您需要从多个模型字段聚合该文档;如果是这样,您可以使用模板。
Every SearchIndex requires there be one (and only one) field with
document=True
. This indicates to both Haystack and the search engine about which field is the primary field for searching within.
请注意,它不是指那里的模型字段!它是 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())
what should I place into that 'document=True' field? Should it be some concatenation of all relevant fields on the model or maybe all but the 'title' field since I've already declared it separately?
是的。
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。