使用 Postgres 和 Rails 进行分面过滤
Faceted filtering using Postgres & Rails
使用 Postgres 作为后端并在 Rails 上使用 Ruby 作为前端来实现分面 search/filter UI 的最佳方法是什么?示例如下:
我认为 Rails 足以实现如上所示的简单表单过滤器。
你只需要有一个好的数据模型,然后就很容易了。
示例:
为了简化表单创建,虽然您可以使用 simple_form,但它绝对是可选的。
使用 ThinkingSphinx 或 Apache Solr - 两者都有内置分面。您可以自己推出(如另一个很好的答案所示),但我的经验表明,您最好添加一个真正的搜索引擎并利用那里的分面功能以及其他搜索功能。我将 Solr 用于所有新开发,但 ThinkingSphinx 通常更容易设置,并且它具有新功能(主要功能是连续索引),使其成为一个很好的竞争者。
select
(
select json_object_agg(COALESCE(brand_id, 'null'), cnt)
from (
select brand_id, COUNT(*) as cnt
from unnest(array_agg(brand_id)) as tmp(brand_id)
group by brand_id
) ttt
),
min(price) as price_min,
max(price) as price_max
from product
WHERE is_visible = true
使用 Postgres 作为后端并在 Rails 上使用 Ruby 作为前端来实现分面 search/filter UI 的最佳方法是什么?示例如下:
我认为 Rails 足以实现如上所示的简单表单过滤器。
你只需要有一个好的数据模型,然后就很容易了。
示例:
为了简化表单创建,虽然您可以使用 simple_form,但它绝对是可选的。
使用 ThinkingSphinx 或 Apache Solr - 两者都有内置分面。您可以自己推出(如另一个很好的答案所示),但我的经验表明,您最好添加一个真正的搜索引擎并利用那里的分面功能以及其他搜索功能。我将 Solr 用于所有新开发,但 ThinkingSphinx 通常更容易设置,并且它具有新功能(主要功能是连续索引),使其成为一个很好的竞争者。
select
(
select json_object_agg(COALESCE(brand_id, 'null'), cnt)
from (
select brand_id, COUNT(*) as cnt
from unnest(array_agg(brand_id)) as tmp(brand_id)
group by brand_id
) ttt
),
min(price) as price_min,
max(price) as price_max
from product
WHERE is_visible = true