由elasticsearch支持的django haystack似乎将Decimal命令为字符串

时间:2015-06-17 15:39:48

标签: elasticsearch django-haystack

我有这个型号(django-oscar产品):

class Product(AbstractProduct):
    # ...
    price_display = models.DecimalField(decimal_places=2, max_digits=12, blank=True, null=True)
    # ...

由haystack索引:

class ProductIndex(indexes.SearchIndex, indexes.Indexable):
    # ...
    price = indexes.DecimalField(null=True)
    # ...
    def prepare_price(self, obj):
        return obj.price_display or Decimal('0.0')

Haystack由elasticsearch支持

pip freeze | grep elastic
elasticsearch==1.6.0
pyelasticsearch==1.4
pip freeze | grep hays
django-haystack==2.1.0

现在这个查询集:

# ...
qs = qs.filter(text__contains=q)
qs = qs.order_by('price')

返回以这种方式订购的价格的(正确找到的)对象:

120  130  24  300 ... 9

无法弄清楚出了什么问题......

1 个答案:

答案 0 :(得分:1)

Haystack(至少我正在使用的版本)将一个Decimal字段发送到弹性作为: “价格”:{ “类型”: “字符串”, “存储”:真 “term_vector”: “with_positions_offsets”, “分析器”: “雪球”},

所以它看起来不像一个字符串,它正在订购一个字符串......

我已经改变了我的代码以使用浮点数,而不是这个问题,我们现在不再谈钱了。

price = indexes.FloatField(null=True)

def prepare_price(self, obj):
    if obj.price_display:
        return float(str(obj.price_display))
    return float('0.0')

现在它将字段发送为: “价格”:{ “类型”: “浮动”, “索引”: “分析”, “商店”:真},

和订购工作,yay