Результат запроса elasticsearch сгруппирован по нескольким полям

Здравствуйте, спасибо заранее, я новичок в elasticsearch, и у меня есть вопрос относительно запроса, у меня есть список медиа, который имеет много полей:

{

"название": "ххх"

"Идентификатор пользователя": "1"

"изображение": "zzz.jpg"

"город": "Париж"

.....

}

Мне нужно получить все медиафайлы для города Парижа и выставить счет для первого x количества изображений для каждого пользователя, чтобы результат не брался у одного и того же пользователя. Например:

Допустим, мы хотим подтолкнуть оценку первых 2 изображений для каждого пользователя:

пользователь1 изображение1

пользователь1 изображение2

пользователь1 изображение3

пользователь1 изображение4

пользователь2 изображение1

пользователь2 изображение2

пользователь2 изображение3

пользователь2 изображение4

пользователь2 изображение5

пользователь2 изображение6

пользователь3 изображение1

пользователь3 изображение2

пользователь3 изображение3

........

ожидаемый результат:

пользователь1 изображение1

пользователь1 изображение2

пользователь2 изображение1

пользователь2 изображение2

пользователь3 изображение1

пользователь3 изображение2

пользователь1 изображение3

пользователь1 изображение4

пользователь2 изображение3

пользователь2 изображение4

пользователь2 изображение5

пользователь2 изображение6

пользователь3 изображение3


person A.Malak    schedule 14.04.2016    source источник
comment
Добро пожаловать в StackOverflow. Прямо сейчас ваш вопрос неясен, что вы спрашиваете. Попробуйте добавить некоторый код и конкретно указать, где у вас возникли проблемы.   -  person buczek    schedule 14.04.2016


Ответы (1)


Вы можете попробовать запрос следующим образом:

GET _search
{
  "query": {
    "query_string": {
      "query": "*"
    }
  },
  "size": 0, 
  "aggs": {
    "@user_id": {
      "terms": {
        "field": "user_id",
        "size": 0,
        "order": {
              "_term": "asc"
            }
      },
      "aggs": {
        "@image": {
          "terms": {
            "field": "image",
            "size": 2,
            "order": {
              "_term": "asc"
            }
          },
          "aggs": {
            "@source": {
              "top_hits": {
                "size": 1
              }
            }
          }
        }
      }
    }
  }
}

"size": 2 в @image ggs позволяет указать количество изображений. Вывод будет таким:

    {
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 1,
      "successful": 1,
      "failed": 0
   },
   "hits": {
      "total": 16,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "@user_id": {
         "doc_count_error_upper_bound": 0,
         "sum_other_doc_count": 0,
         "buckets": [
            {
               "key": "user1",
               "doc_count": 4,
               "@image": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 2,
                  "buckets": [
                     {
                        "key": "image1",
                        "doc_count": 1,
                        "@source": {
                           "hits": {
                              "total": 1,
                              "max_score": 1,
                              "hits": [
                                 {
                                    "_index": "test",
                                    "_type": "test",
                                    "_id": "AVQVaph2LY9bI6YPTNWp",
                                    "_score": 1,
                                    "_source": {
                                       "user_id": "user1",
                                       "image": "image1"
                                    }
                                 }
                              ]
                           }
                        }
                     },
                     {
                        "key": "image2",
                        "doc_count": 1,
                        "@source": {
                           "hits": {
                              "total": 1,
                              "max_score": 1,
                              "hits": [
                                 {
                                    "_index": "test",
                                    "_type": "test",
                                    "_id": "AVQVareVLY9bI6YPTPCg",
                                    "_score": 1,
                                    "_source": {
                                       "user_id": "user1",
                                       "image": "image2"
                                    }
                                 }
                              ]
                           }
                        }
                     }
                  ]
               }
            },
            {
               "key": "user2",
               "doc_count": 4,
               "@image": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 2,
                  "buckets": [
                     {
                        "key": "image1",
                        "doc_count": 1,
                        "@source": {
                           "hits": {
                              "total": 1,
                              "max_score": 1,
                              "hits": [
                                 {
                                    "_index": "test",
                                    "_type": "test",
                                    "_id": "AVQVau9JLY9bI6YPTSPx",
                                    "_score": 1,
                                    "_source": {
                                       "user_id": "user2",
                                       "image": "image1"
                                    }
                                 }
                              ]
                           }
                        }
                     },
                     {
                        "key": "image2",
                        "doc_count": 1,
                        "@source": {
                           "hits": {
                              "total": 1,
                              "max_score": 1,
                              "hits": [
                                 {
                                    "_index": "test",
                                    "_type": "test",
                                    "_id": "AVQVavh1LY9bI6YPTSP0",
                                    "_score": 1,
                                    "_source": {
                                       "user_id": "user2",
                                       "image": "image2"
                                    }
                                 }
                              ]
                           }
                        }
                     }
                  ]
               }
            },
            {
               "key": "user3",
               "doc_count": 4,
               "@image": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 2,
                  "buckets": [
                     {
                        "key": "image1",
                        "doc_count": 1,
                        "@source": {
                           "hits": {
                              "total": 1,
                              "max_score": 1,
                              "hits": [
                                 {
                                    "_index": "test",
                                    "_type": "test",
                                    "_id": "AVQVayTFLY9bI6YPTVZA",
                                    "_score": 1,
                                    "_source": {
                                       "user_id": "user3",
                                       "image": "image1"
                                    }
                                 }
                              ]
                           }
                        }
                     },
                     {
                        "key": "image2",
                        "doc_count": 1,
                        "@source": {
                           "hits": {
                              "total": 1,
                              "max_score": 1,
                              "hits": [
                                 {
                                    "_index": "test",
                                    "_type": "test",
                                    "_id": "AVQVazP4LY9bI6YPTWnK",
                                    "_score": 1,
                                    "_source": {
                                       "user_id": "user3",
                                       "image": "image2"
                                    }
                                 }
                              ]
                           }
                        }
                     }
                  ]
               }
            },
            {
               "key": "user4",
               "doc_count": 4,
               "@image": {
                  "doc_count_error_upper_bound": 0,
                  "sum_other_doc_count": 2,
                  "buckets": [
                     {
                        "key": "image1",
                        "doc_count": 1,
                        "@source": {
                           "hits": {
                              "total": 1,
                              "max_score": 1,
                              "hits": [
                                 {
                                    "_index": "test",
                                    "_type": "test",
                                    "_id": "AVQVa16pLY9bI6YPTbgL",
                                    "_score": 1,
                                    "_source": {
                                       "user_id": "user4",
                                       "image": "image1"
                                    }
                                 }
                              ]
                           }
                        }
                     },
                     {
                        "key": "image2",
                        "doc_count": 1,
                        "@source": {
                           "hits": {
                              "total": 1,
                              "max_score": 1,
                              "hits": [
                                 {
                                    "_index": "test",
                                    "_type": "test",
                                    "_id": "AVQVa2a3LY9bI6YPTcuX",
                                    "_score": 1,
                                    "_source": {
                                       "user_id": "user4",
                                       "image": "image2"
                                    }
                                 }
                              ]
                           }
                        }
                     }
                  ]
               }
            }
         ]
      }
   }
}
person Кирилл Полищук    schedule 14.04.2016
comment
спасибо за ответ, но я пытаюсь получить результат в хитах, а не в агрегатах - person A.Malak; 18.04.2016