【问题标题】:Searchkick Nested DataSearchkick 嵌套数据
【发布时间】:2020-03-08 18:56:41
【问题描述】:

手册说明了这一点 (https://github.com/ankane/searchkick#nested-data):

嵌套数据

要查询嵌套数据,请使用点表示法。

User.search "san", fields: ["address.city"], where: {"address.zip_code" => 12345}

这根本行不通,或者给出的示例需要更多限定。

就我而言,我有 ExpenditureItem which belongs_to: Expenditure 所以我试试这个:

ExpenditureItem.search("*", where: { "expenditure.budget_id": '2'})

什么都没有。我知道在我的search_data 我可以设置:

budget_id: expenditure.budget_id

但从示例看来,重点是能够快速轻松地完成嵌套搜索。

我错过了什么吗?

【问题讨论】:

    标签: elasticsearch searchkick elasticsearch-nested


    【解决方案1】:

    嵌套查询只能在嵌套字段上执行,在您的映射中指定。您将不得不 override 您的默认索引,这相当于在您的 ElasticSearch mapping 中明确定义它。

    【讨论】:

    • 那么您所说的是search_data 中未显示的示例中的address_city: address[:city] 等?
    • 我说的是expenditure.budget_id: expenditure[:budget_id]
    【解决方案2】:

    关联不会自动索引为嵌套数据。

    在您的情况下,您需要在 search_data 方法中明确包含要索引的关联。

    例如,要包含 ExpenditureItem 模型以及 Expenditure 关联中的所有字段,您可以这样做:

    def search_data
      as_json.merge({
        expenditure: expenditure.as_json
      })
    end
    

    如果您不需要索引所有属性,那么您当然可以修改as_json 方法参数以在索引中包含或排除您需要的属性和实例方法。

    此外,为了提高索引的性能,请务必在 search_import 范围内使用 include the association,例如

    scope :search_import, -> { includes(:expenditure) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-21
      • 2014-05-11
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 1970-01-01
      相关资源
      最近更新 更多