Сгруппировать результат поиска? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть базовая c Настройка системы Searchkick. Я хочу взять результаты и затем сгруппировать их по атрибуту для суммирования другого атрибута и т. Д. c.

Этот вопрос близок к моей проблеме:

Elasticsearch + searckick

, и единственным ответом было использование агрегаций. Я мог бы сделать это, но тогда я бы построил вызов активной записи для каждого из возвращенных ключей agg.

Вот что у меня есть:

BudgetItem.all.search("*", body_options: { aggs: { cbs_item_id: { terms: { field: "cbs_item_id" }, aggs: { "total": { "sum": { "field": "total"  } } } } } } )

, что приводит к:

 "aggregations"=>{"cbs_item_id"=>{"doc_count_error_upper_bound"=>0, "sum_other_doc_count"=>0, "buckets"=>[{"key"=>5, "doc_count"=>2, "total"=>{"value"=>2956.0}}, {"key"=>6, "doc_count"=>2, "total"=>{"value"=>7734.0}}]}}}>

в моих search_data у меня есть термин «cbs», который представляет собой текстовое значение, которое относится к «cbs_item_id». Я ищу этот результат:

"aggregations"=>
  {"cbs_item_id"=>
     {"doc_count_error_upper_bound"=>0, "sum_other_doc_count"=>0, "buckets"=>
     [{"key"=>5, "doc_count"=>2, "total"=>{"value"=>2956.0}, "cbs"=>{"value"=>"MY CBS Related Field" }},
      {"key"=>6, "doc_count"=>2, "total"=>{"value"=>7734.0}, "cbs"=>{"value"=>"MY OTHER CBS Related Field" }}]}}}

Это то, где у вас есть в инвентаре автомобилей и отдельная таблица car_colors ([id = 1, color = red], [id = 3, color = синий]. Я хочу найти автомобили заданного цвета, затем сгруппировать их и суммировать и т.д. c.

Я уверен, что, возможно, я упускаю что-то простое здесь.

ОБНОВЛЕНИЕ

Приближение:

BudgetItem.all.search("*", body_options: { aggs: { cbs_item_id: { terms: { field: "cbs_item_id" }, aggs: { cbs: { terms: { field: "cbs" } }, "total": { "sum": { "field": "total"  } } } } } } )

, что приводит к:

  "buckets"=>
    [{"key"=>5, "doc_count"=>2, "total"=>{"value"=>2956.0}, "cbs"=>{"doc_count_error_upper_bound"=>0, "sum_other_doc_count"=>0, "buckets"=>[{"key"=>"001", "doc_count"=>2}]}},
     {"key"=>6, "doc_count"=>2, "total"=>{"value"=>7734.0}, "cbs"=>{"doc_count_error_upper_bound"=>0, "sum_other_doc_count"=>0, "buckets"=>[{"key"=>"002", "doc_count"=>2}]}}]}}

Второй «ключ» s 001 и 002 - это данные, которые я ищу .

...