thinking sphinx如何做多方面搜索rails
How to do multi facets search in thinking sphinx rails
在我的应用程序中使用 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
使用一组有限的 Thinking Sphinx 中间件 类,以避免将结果转换为 ActiveRecord 对象 - 相反,您将获得包含 Sphinx 查询数据的哈希数组。
在我的应用程序中使用 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
使用一组有限的 Thinking Sphinx 中间件 类,以避免将结果转换为 ActiveRecord 对象 - 相反,您将获得包含 Sphinx 查询数据的哈希数组。