【问题标题】:Sunspot and Advanced Association Search太阳黑子和高级关联搜索
【发布时间】:2012-07-06 06:38:46
【问题描述】:

我的应用有Machines,它拥有并属于许多Specifications

class Machine < ActiveRecord::Base
  has_and_belongs_to_many :specs

规格同时具有field(宽度、重量、容量、马力)和value 属性。

搜索完全通过 Solr 通过 Sunspot 完成。

我希望能够根据规格找到机器,例如查找宽度大于 50 的所有机器。

我知道我可以分别索引 spec_fieldspec_value,但它会过滤值超过 50 的规格,其中可能包括我不想要的字段,例如高度或容量(所以搜索宽度 > 50 将产生 > 50 的结果)。

理想情况下,我想将机器的每个规格及其值分配给自己的索引字段,以便我的索引具有诸如“高度”或“重量”之类的字段,但规格是灵活的,有些机器有一套规格,而另一台机器有不同的一套,所以看起来不行。

甚至可以用 Solr 完成吗?

【问题讨论】:

    标签: ruby-on-rails ruby search solr sunspot


    【解决方案1】:

    找到解决方案

    我找到的解决方案是使用“动态字段”,如 here 所述

    索引

    dynamic_integer :specs do
      specs.inject({}) do |hash,spec|
        hash.merge(spec.spec_field.label.to_sym => spec.value)
      end
    end
    

    查询

      dynamic :specs do
        if params[:specs].present?
          for spec in params[:specs]
            case spec[:condition]
              when "gt"
                with(spec[:field]).greater_than(spec[:value])
              when "lt"
                with(spec[:field]).less_than(spec[:value])
              else
                with(spec[:field],spec[:value])
            end
          end
        end
      end
    

    SOLR 在我看来越来越好!

    【讨论】:

    • +1 如果我可以向您发送许多声望点,我会的。这是完美的:)
    【解决方案2】:

    您可以构造一个方法,为您指定的数字范围和字符串值返回 TRUE,然后索引该布尔值。

    def width_greater_than_50
      (field == "width") && (value > 50)
    end
    

    然后您将传递符号 :width_greater_than_50 作为您想要索引的东西。

    【讨论】:

    • 它将如何工作?我知道这将索引机器的宽度是否超​​过 50,但现在我需要搜索超过 200 的“容量”,比如说。我无法索引所有可能的搜索查询。
    • 哦,我误会了;我认为这是一个索引问题。听起来你有更多的查询问题。对吗?
    • 我认为它既是索引问题又是查询问题,主要是因为我不知道该怎么做......如果你看看 solr.CurrencyField,你会看到它是如何存储在“金额,currency" 格式,然后以某种方式能够搜索到它。我觉得这是我应该关注的方向,但仍然没有任何线索。
    猜你喜欢
    • 2014-05-30
    • 2015-01-23
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2015-12-20
    相关资源
    最近更新 更多