我正在尝试使用Solr及其通过Haystack运行的交互模块PySolr在我的Django项目中实现搜索。我能够正确配置Solr,但是当我运行命令python manage.py rebuild_index
时,我收到错误Invalid Date in Date Math String
。
的官方文档,Solr日期时间格式YYYY-MM-DDThh:mm:ssZ
(例如 2016-07-13T14:31:07.237204Z
),但 PySolr 中的日期时间格式可能YYYY-MM-DDThh:mm:ss+TT:TTZ
(例如 2016-07-13T14:31:07.237204+03:00Z
),其中TT:TT
是时区偏移量(分别为小时和分钟)。
我在search_indexes.py的代码:
from haystack import indexes
from .models import Item
class ItemIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
name = indexes.CharField(model_attr='name')
updated = indexes.DateTimeField(model_attr='updated')
def get_model(self):
return Item
def index_queryset(self, using=None):
return self.get_model().objects.all()
任何想法如何解决此错误?
这个问题的一个解决方案非常简单。Haystack 后端具有prepare_FOO(self, obj)
函数,其中 FOO
是索引字段之一。此函数允许您在每个FOO
元素编制索引之前更新获得的值。因此,我们可以对字段中updated
日期时间执行后处理,并将其转换为默认的 Solr 格式。
在我的情况下,代码如下所示:
class ItemIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
name = indexes.CharField(model_attr='name')
updated = indexes.DateTimeField(model_attr='updated')
def get_model(self):
return Item
def index_queryset(self, using=None):
return self.get_model().objects.all()
def prepare_updated(self, obj):
updated = u''
if 'updated' in self.prepared_data:
updated = self.prepared_data['updated'].strftime('%Y-%m-%dT%H:%M:%SZ')
return updated
prepare_updated(self, obj)
函数在索引期间获取updated
字段中的每个日期时间,并将其转换为YYYY-MM-DDThh:mm:ssZ
形式。