Django-haystack: `order_by`は` DecimalField`では機能しません

作成日 2011年08月09日  ·  12コメント  ·  ソース: django-haystack/django-haystack

DecimalFieldは、インデックス作成時にstringとして格納されるため、 order_byを使用すると期待される結果が得られません。

数値で並べ替える代わりに、データをアルファベット順に並べ替えます。

Xapianバックエンドの関連する問題はこちら: https

needs review

最も参考になるコメント

この回避策の1つは、10進フィールドの内容を整数として格納することです。 たとえば、priceというDecimalフィールドを持つMyModelというモデルがある場合、それを小数点以下の桁数で乗算して整数として格納できます。

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

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

全てのコメント12件

おそらく、これに(迅速に)対処する最善の方法は、 DecimalFieldドキュメントを更新して、 order_byがサポートされていないことを示すことです。

長期的には、 DecimalField order_by操作が試行されると、警告レベルのログメッセージが出力される可能性があります。 パフォーマンス上の理由から、フィールドタイプの検証は、サイトがDEBUGモードの場合にのみ実行できました。

この回避策の1つは、10進フィールドの内容を整数として格納することです。 たとえば、priceというDecimalフィールドを持つMyModelというモデルがある場合、それを小数点以下の桁数で乗算して整数として格納できます。

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が機能しない」と記載されている場合は、フィールドタイプを非推奨にするか、フィールドタイプのリストに明確な警告を表示する必要があると思います。大規模なデータベースがある場合は、間違いがあり、修復に時間がかかります。

Elasticsearchでも機能しません

:+1:

@JoeJasinskiどうもありがとうございました、あなたの答えは私を助けました

この回避策の1つは、10進フィールドの内容を整数として格納することです。 たとえば、priceというDecimalフィールドを持つMyModelというモデルがある場合、それを小数点以下の桁数で乗算して整数として格納できます。

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 評価