Get max and min value of a column with thinking sphinx

半城伤御伤魂 提交于 2019-12-12 00:43:23

问题


I'm working with Rails and thinking sphinx. I have a model Product indexed as following (only showing relevant information)

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

What I need is to get the Product with max price of the current search. I've tried something like

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

but it's returning me a mess.

>> 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]

I really don't understand why it's doing that strange query, why it's adding that where and why it's returning an array.

Regards, Franco.


回答1:


The short answer: Sphinx can't return aggregate data - it always returns document records (in this case, products). You'll have to use ActiveRecord/SQL for this type of query.

As for why your attempt is returning odd values: with Thinking Sphinx v2 and earlier, the :select option is passed through to the underlying ActiveRecord call when Sphinx results are translated into ActiveRecord options (the SQL call you can see). You've removed the primary key from the SELECT clause, and so Thinking Sphinx isn't able to match Sphinx results to Product instances, and thus nil is returned for each failed match.



来源:https://stackoverflow.com/questions/15906005/get-max-and-min-value-of-a-column-with-thinking-sphinx

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!