使用 Django 1.9 和 Solr 6.1 创建索引时日期数学字符串中的日期无效错误



我正在尝试使用Solr及其通过Haystack运行的交互模块PySolr在我的Django项目中实现搜索。我能够正确配置Solr,但是当我运行命令python manage.py rebuild_index时,我收到错误Invalid Date in Date Math String

根据Solr

的官方文档,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形式。

最新更新