Python 主字段名(document=True)
Django Haystack: 但我不明白它的意思。这是他们的示例模型: 导入日期时间 从haystack导入索引 从myapp.models导入说明Python 主字段名(document=True),python,django,django-haystack,Python,Django,Django Haystack,Django Haystack: 但我不明白它的意思。这是他们的示例模型: 导入日期时间 从haystack导入索引 从myapp.models导入说明 class NoteIndex(indexes.SearchIndex, indexes.Indexable): text = indexes.CharField(document=True, use_template=True) author = indexes.CharField(model_attr='user')
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())
我引用的文本是指我的模型主字段,并说我应该称它为“text”,还是指search_index.py中定义的类
如果指向search_indexes.py中的类,则在上面的示例中,它附加到的字段名在哪里?它没有型号属性
text = indexes.CharField(document=True, use_template=True)
如果说到我的实际应用程序模型,我将如何重构一个包含许多应用程序的项目,并将其主文本字段称为“text”
请告知。谢谢。您的
搜索索引定义不需要反映您的模型定义,它需要将不同模型的数据映射到通用搜索文档。
model\u attr
关键字)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
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
在这个糟糕的示例中,每个搜索索引都定义了一个主要内容字段和一个内容名称字段(标题或主题)。但是你现在怎么搜索呢?如果您根据主题
对内容进行查询,您将错过注释
内容,同样,如果您根据正文
进行查询,您也会错过内容
更好的例子(这样做):
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
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
根据您的指定转换数据
至于您关于缺少的
型号属性的问题,这只是获取内容的一种方法。您还可以从模板中呈现文本内容,这是上面的text
字段所做的(请参见该模板上的)。model\u attr
源代码适用于简单的字符字段。您的SearchIndex
定义不需要反映您的模型定义,它需要将不同模型的数据映射到通用搜索文档。
为什么文本字段需要统一命名
地图内容是如何来源的?(为什么没有model\u 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
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
在这个糟糕的示例中,每个搜索索引都定义了一个主要内容字段和一个内容名称字段(标题或主题)。但是你现在怎么搜索呢?如果您根据主题
对内容进行查询,您将错过注释
内容,同样,如果您根据正文
进行查询,您也会错过内容
更好的例子(这样做):
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
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
根据您的指定转换数据
至于您关于缺少的型号属性的问题,这只是获取内容的一种方法。您还可以从模板中呈现文本内容,这是上面的text
字段所做的(请参见该模板上的)。model\u attr
源代码适用于简单字符字段