0

我正在使用 Rails 并思考狮身人面像。我有一个模型产品索引如下(仅显示相关信息)

define_index do
   indexes :name, :as => :name, :sortable => true
   indexes color, :facet => true
   ...
   indexes price, :as => :range, :facet => true
   has created_at, price, root_category_id
   ...
end

我需要的是获得当前搜索的最高价格的产品。我试过类似的东西

 Product.search('', :select => 'MAX(price)')

但它让我一团糟。

>> Product.search_for_ids( :select => 'MAX(price)')
Sphinx Query (3.0ms)  
Sphinx  Found 732 results
Product Load (0.4ms)  SELECT MAX(price) FROM `products` WHERE `products`.`id` IN (388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 401, 402, 403, 404, 405, 406, 407, 408)
=> [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]

我真的不明白它为什么要执行那个奇怪的查询,为什么要在哪里添加它以及为什么要返回一个数组。

问候,佛朗哥。

4

1 回答 1

2

简短的回答:Sphinx 不能返回聚合数据——它总是返回文档记录(在这种情况下是产品)。对于这种类型的查询,您必须使用 ActiveRecord/SQL。

至于为什么您的尝试返回奇数值:使用 Thinking Sphinx v2 及更早版本,:select当 Sphinx 结果转换为 ActiveRecord 选项(您可以看到的 SQL 调用)时,该选项将传递给底层的 ActiveRecord 调用。您已从 SELECT 子句中删除了主键,因此 Thinking Sphinx 无法将 Sphinx 结果与 Product 实例匹配,因此每个失败的匹配都返回 nil。

于 2013-04-09T15:29:34.727 回答