Elasticsearch — подсчет вхождений элементов во вложенное поле

#elasticsearch

#elasticsearch

Вопрос:

У меня есть индекс elasticsearch с этой упрощенной структурой:

 {
    "id": "group1",
    "users": [
        {
            "user_id": "user1"
        },
        {
            "user_id": "user2"
        }
    ]
},
{
    "id": "group2",
    "users": [
        {
            "user_id": "user1"
        },
        {
            "user_id": "user3"
        },
    ]
},
{
    "id": "group3",
    "users": [
        {
            "user_id": "user1"
        },
        {
            "user_id": "user3"
        },
    ]
}
  

Мне нужно получить количество документов, в которых появляется каждый пользователь. Что-то вроде этого:

 [
    {
        "key": "user1",
        "doc_count": 3
    },
    {
        "key": "user2",
        "doc_count": 1
    },
    {
        "key": "user3",
        "doc_count: 2
    }
]
  

Ответ №1:

Вам необходимо использовать вложенную агрегацию с терминами агрегация

Добавление рабочего примера с сопоставлением индексов, поисковым запросом и результатом поиска

Сопоставление индексов:

 {
  "mappings":{
    "properties":{
      "users":{
        "type":"nested"
      }
    }
  }
}
  

Поисковый запрос:

 {
 "size":0,
  "aggs": {
    "resellers": {
      "nested": {
        "path": "users"
      },
      "aggs": {
        "unique_user": {
          "terms": {
            "field": "users.user_id.keyword"
          }
        }
      }
    }
  }
}
  

Результат поиска:

 "aggregations": {
    "resellers": {
      "doc_count": 6,
      "unique_user": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "user1",
            "doc_count": 3
          },
          {
            "key": "user3",
            "doc_count": 2
          },
          {
            "key": "user2",
            "doc_count": 1
          }
        ]
      }
    }
  }