在我的应用中使用thinking-sphinx
作为方面,并定义两个方面price
和year
。
我想获取构面嵌套的结果。
现在我每年都在获取方面,它与年份相对应。
years = records[:year]
连同记录数以及年份,我也想获得该年的最低价格。
现在我得到它了
years.map do |year,count|
price = Data.where(:year=>year).minimum(:price)
{count: count,cheapest_price: price}
end
但是它像LazyLoading一样是N + 1。我想在一年内获取价格。
有什么办法吗?
我思考该代码可以实现您想要的功能-尽管您可能需要进行一些调整才能准确获得所需的内容:
Data.search(
:select => "groupby() AS year, MIN(price) as min_price, count(DISTINCT sphinx_internal_id) as count",
:group_by => :year,
:max_matches => 1000,
:middleware => ThinkingSphinx::Middlewares::RAW_ONLY
)
每个选项说明:
select
指定要遵循的适当聚合,groupby()
是引用此查询分组依据的属性的函数。group_by
指定您要查询分组的属性。 Sphinx在SQL中等同于GROUP BY
,尽管在过去它受到了更大的限制。max_matches
应该设置为1000,除非您已在Sphinx配置中将其配置为更高的值(通过config/thinking_sphinx.yml
)。使用尽可能高的值可确保构面结果扫描尽可能多的文档。您还可以为要返回的特定行数将:limit
设置为相同的值。middleware
使用有限的Think Sphinx中间件类集,以避免将结果转换为ActiveRecord对象-相反,您将获得带有Sphinx查询数据的哈希数组。