Django-haystack: `order_by` 不适用于 `DecimalField`

创建于 2011-08-09  ·  12评论  ·  资料来源: django-haystack/django-haystack

因为DecimalField在索引时存储为string ,所以在使用order_by时不会产生预期的结果。

它不是按数值排序,而是按字母顺序对数据进行排序。

Xapian 后端的相关问题在这里: https :

needs review

最有用的评论

对此的一种解决方法是将十进制字段的内容存储为整数。 例如,如果我有一个名为 MyModel 的模型,其中有一个名为 price 的 Decimal 字段,我可以将它乘以小数位数并存储为整数。

class MyIndex(SearchIndex):
    ...
    price = IntegerField(model_attr='price')

    def prepare_price(self, obj):
        return int(obj.price * Decimal('100'))

所有12条评论

也许(快速)解决这个问题的最好方法是更新DecimalField文档以表明不支持order_by

从长远来看,一个警告LEVE日志消息可能是当输出order_by试图在操作DecimalField 。 出于性能原因,字段类型的验证只能在站点处于DEBUG模式时进行。

对此的一种解决方法是将十进制字段的内容存储为整数。 例如,如果我有一个名为 MyModel 的模型,其中有一个名为 price 的 Decimal 字段,我可以将它乘以小数位数并存储为整数。

class MyIndex(SearchIndex):
    ...
    price = IntegerField(model_attr='price')

    def prepare_price(self, obj):
        return int(obj.price * Decimal('100'))

这似乎适用于 elasticsearch 但不适用于 solr。

该错误显然也适用于 Whoosh。

范围查询在 elasticsearch 上也失败。

+1

我使用 SolrBackend 遇到了同样的问题。 我们按一个字段排序,该字段包含一个 0.0 - 1.0 之间的数字,表示复杂的评分算法。 当按字符串排序时,这意味着分数非常小的元素排在分数较大的元素之上,例如 9e-08

公平地,明显的解决方法是使用浮点字段(对我的目的来说并不重要)。

这很糟糕。 如果它不会被修复,而只是记录为“order_by 不起作用”,那么我认为我们应该弃用字段类型或在字段类型列表中明确警告,因为它很容易使用错误,如果你有一个大数据库,修复速度会很慢。

也不适用于弹性搜索

:+1:

@JoeJasinski 非常感谢你,你的回答帮助了我

对此的一种解决方法是将十进制字段的内容存储为整数。 例如,如果我有一个名为 MyModel 的模型,其中有一个名为 price 的 Decimal 字段,我可以将它乘以小数位数并存储为整数。

class MyIndex(SearchIndex):
    ...
    price = IntegerField(model_attr='price')

    def prepare_price(self, obj):
        return int(obj.price * Decimal('100'))

进而?
MyIndex.objects.all().order_by('prepare_price') ? 对?

此页面是否有帮助?
0 / 5 - 0 等级