【问题标题】:Rails 4 elasticsearch using multiple search conditions, combine search featureRails 4 elasticsearch使用多个搜索条件,结合搜索功能
【发布时间】:2017-04-23 04:57:42
【问题描述】:

我在一个项目中使用elasticsearch-rails,有一个组合搜索功能,所有列都在一个表中。我只是写了一个自定义的搜索功能,搜索dsl不起作用,不能有任何结果。

def self.combine_search_filter(remark=nil, sim_card_supplier_id=nil, work_mode=nil, operator_status=nil, platform_management_status=nil, online_status=nil, sim_card_set_id=nil, iccid_from=nil, iccid_to=nil, actived_at_from=nil, actived_at_to=nil, check_in_at_from=nil, check_in_at_to=nil, device_mac_from=nil, device_mac_to=nil)
    response = __elasticsearch__.search(
      "size": 1000,
      "query": {
        "filtered": {
          "filter":   {
            "bool": {
              "filter":   [
                { "term":  { "sim_card_supplier_id": sim_card_supplier_id } },
                { "term":  { "work_mode": work_mode } },
                { "term":  { "operator_status": operator_status } },
                { "term":  { "platform_management_status": platform_management_status } },
                { "term":  { "online_status": online_status } },
                { "term":  { "sim_card_set_id": sim_card_supplier_id } }
                { "range": { "iccid": { "from": iccid_from, "to": iccid_to }}},
                { "range": { "check_in_at": { "from": check_in_at_from, "to": check_in_at_to }}},
                { "range": { "actived_at": { "from": actived_at_from, "to": actived_at_to }}},
                { "range": { "device_mac": { "from": device_mac_from, "to": device_mac_to }}}
              ]
            }
          }
        }
      }
    )
end

并且参数可能通过 nil,我怎样才能使搜索 dsl 有效?

【问题讨论】:

  • 我没有使用elasticsearch-rails gem 的经验,但我很确定这可以使用searchkick github.com/ankane/searchkick 轻松完成,它再次使用elasticsearch 服务器。如果你愿意,可以试一试。
  • 它会抛出任何错误吗?你也可以发一下吗?

标签: ruby-on-rails ruby elasticsearch elasticsearch-rails


【解决方案1】:

我宁愿建议您使用searchkick gem for rails,它使弹性搜索变得如此简单,并使您的搜索更智能,查询更简单。

【讨论】:

    【解决方案2】:

    我的错,我只是想通了,ruby 关键字函数应该是这样的:

    def self.combine_search_filter(options = {})
        response = __elasticsearch__.search(
          "size": 1000,
          "query": {
            "filtered": {
              "filter":   {
                "bool": {
                  "filter":   [
                    { "term":  { "sim_card_supplier_id": 104 } },
                    { "term":  { "work_mode": options[:work_mode] } },
                    { "term":  { "operator_status": options[:operator_status] } },
                    { "term":  { "platform_management_status": options[:platform_management_status] } },
                    { "term":  { "online_status": options[:online_status] } },
                    { "term":  { "sim_card_set_id": 76 } },
                    { "range": { "iccid": { "from": options[:iccid_from], "to": options[:iccid_to] }}},
                    { "range": { "check_in_at": { "from": options[:check_in_at_from], "to": options[:check_in_at_to] }}},
                    { "range": { "actived_at": { "from": options[:actived_at_from], "to": options[:actived_at_to] }}},
                    { "range": { "device_mac": { "from": options[:device_mac_from], "to": options[:device_mac_to] }}}
                  ]
                }
              }
            }
          }
        )
    end
    

    此搜索将得到正确的结果。 options[:key] 可能为 nil 会导致错误的结果,所以我将删除 dsl hash 的 nil 键,然后将其传递给 search()

    【讨论】:

      猜你喜欢
      • 2015-02-23
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多