【问题标题】:RoR - Facet Filtering approachRoR - 分面过滤方法
【发布时间】:2014-11-01 12:06:16
【问题描述】:

我有一个 Ruby on Rails Web 应用程序,它为用户提供搜索/过滤功能。基本上我正在尝试针对这种应用程序进行编程。 http://demo.srchulo.com/jquery/jquery_facets/

但是,我使用 ActiveRecord(无 Elasticsearch 或 Solr)进行搜索。现在我读到 Elasticsearch 和 Solr 支持构面搜索和构面过滤。因此,我想知道我是否需要实现 Elasticsearch 或 Solr 才能进行构面过滤,或者我可以通过简单的 Javascript 查询来实现吗?如果可能,我想避免使用 Elasticsearch 或 Solr。

提前致谢!

【问题讨论】:

  • 我认为 sql 可以通过大量 and 和 have 和 group by 来做到这一点;P

标签: ruby-on-rails facet


【解决方案1】:

您在这里完全混合了所有技术。

  • javascript/jquery -> 客户端浏览器脚本
  • 活动记录 -> 服务器端(关系)数据库 (mysql?) ORM(对象关系映射器)
  • solr/elasticsearch -> 服务器端全文搜索服务

您问题的总体答案是:视情况而定!

我猜你需要提供 a) 更多的上下文信息 b) 弄清楚你到底需要什么来满足你的需求。

【讨论】:

    【解决方案2】:

    我编写了一个 gem 来创建基于 ActiveRecord 的简单分面搜索。

    如上所述,它使用group byhaving 子句来收集有关构面值的信息,并提供一个简单的API 来访问构面并创建链接以缩小结果范围。

    在您看来,您可以像任何其他 ActiveRecord 集合一样迭代结果

    %table.table.table-condensed
      %tbody
        - @movies.each do |movie|
          %tr
            %td
              %strong=movie.title
    
    Use the search object to display further narrowing options to the user
    
    - filter = @search.filter(:genre)
    .col-md-4
      .filter
        .filter-title= filter.name
        .filter-values
          %ul.selected
            - filter.selected.each do |genre|
              %li= link_to genre.name, filter.remove(genre).path
          %ul.selectable
            - filter.facet.reject(&:selected).each do |facet_value|
              - genre = facet_value.genre
              %li
                = link_to genre.name, filter.add(genre).path
                %span.count= "(#{facet_value.count})"
    

    https://github.com/fortytools/forty_facets

    【讨论】:

    • 您通常什么时候会看到具有 40 个面的缩放问题?
    • 很难提出通用指标,因为实际速度取决于您的架构和数据。过滤是通过非常直接的连接和 where(...) 查询完成的。因此,您在普通控制器方法中为加速查询所做的一切都适用于此处。对于每个 Facet,都会发生一个“GROUP-BY”查询。根据构面的数量和构面值,这些成本可能会有很大差异。我不认为自己是数据库专家,但只需在所有相关列上添加索引,我就可以过滤具有多达 100K 行“基本”实体和 4-5 个方面的数据集。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2015-09-26
    • 2018-03-24
    • 2021-05-28
    • 1970-01-01
    相关资源
    最近更新 更多