django-haystack Decimal __lt query

rlcwz9us  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(81)

我有django项目与django-haystack和xapian后端。我创建了一个索引:

sugar=indexes.DecimalField(null=True)

现在,我尝试使用不同的算术运算符过滤SearchQuery,得到奇怪的结果(尝试使用lt,lte,gt和gte过滤器,如:sqs.filter(sugar__lt=60))。然后我过滤掉None,对结果进行排序并转换为float以获得更好的视图。

sqs.count()=130, len(sqs_lt)=114, len(sqs_gt)=130, len(sqs_lte)=0, len(sqs_gte)=16
vals_lt=[0.1, 0.1, 0.3, 0.3, 0.4, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.6, 0.6, 0.7, 0.8, 0.8, 0.8, 0.8, 1.0, 1.1, 1.1, 1.1, 1.1, 1.1, 1.3, 1.33, 1.4, 1.5, 1.8, 1.8, 2.0, 2.0, 2.0, 2.0, 2.1, 2.2, 2.2, 2.4, 2.5, 2.5, 2.78, 2.8, 2.9, 3.0, 3.07, 3.2, 3.2, 3.4, 3.6, 3.9, 4.0, 4.9, 6.0, 6.0, 6.2, 6.3, 6.3, 6.6, 12.0, 12.0, 12.4, 12.5, 13.7, 14.0, 18.0, 20.0, 22.0, 22.0, 23.0, 24.1, 24.8, 26.0, 26.0, 26.5, 27.7, 30.96, 34.0, 39.0, 40.0, 40.0, 41.0, 42.2, 42.5, 43.0, 46.0, 48.0, 51.1, 52.0, 54.0, 100.0]
vals_gt=[0.1, 0.1, 0.3, 0.3, 0.4, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.6, 0.6, 0.7, 0.8, 0.8, 0.8, 0.8, 1.0, 1.1, 1.1, 1.1, 1.1, 1.1, 1.3, 1.33, 1.4, 1.5, 1.8, 1.8, 2.0, 2.0, 2.0, 2.0, 2.1, 2.2, 2.2, 2.4, 2.5, 2.5, 2.78, 2.8, 2.9, 3.0, 3.07, 3.2, 3.2, 3.4, 3.6, 3.9, 4.0, 4.9, 6.0, 6.0, 6.2, 6.3, 6.3, 6.6, 7.25, 7.5, 8.2, 8.5, 8.5, 9.3, 12.0, 12.0, 12.4, 12.5, 13.7, 14.0, 18.0, 20.0, 22.0, 22.0, 23.0, 24.1, 24.8, 26.0, 26.0, 26.5, 27.7, 30.96, 34.0, 39.0, 40.0, 40.0, 41.0, 42.2, 42.5, 43.0, 46.0, 48.0, 51.1, 52.0, 54.0, 60.0, 60.0, 63.0, 67.0, 68.0, 70.0, 71.0, 72.0, 72.0, 90.0, 100.0]
vals_lte=[]
vals_gte=[7.25, 7.5, 8.2, 8.5, 8.5, 9.3, 60.0, 60.0, 63.0, 67.0, 68.0, 70.0, 71.0, 72.0, 72.0, 90.0]

我怀疑__lt几乎可以正确地工作(除了莫名其妙的100),但是__gte看起来更像是字典比较。我错过了什么?

sqxo8psd

sqxo8psd1#

我看得更深了。在xapian_backend中的当前实现中,Decimal将被转换为字符串,因此需要进行字典比较。我不知道人们使用xapian后端的频率(我选择它是为了测试MVP的速度),但是django-oscar在catalogue.product中的价格也是Decimal,他们很乐观地认为它可以作为haystack的DecimalIndex。对于10个硬币以下的价格,它将主要工作虽然:)
我将在相同的设置中跟进float的血淋淋的细节。

相关问题