ElasticSearch Агрегировать по атрибуту в поле, которое является списком

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

{
  ArticleId: 1,
  Title: "1",
  Reviewers: [
    {
       "Reviewer": "abc",
       "Status": "Pending"
    },
    {
       "Reviewer": "def",
       "Status": "Approved"
    }
  ]
}

{
  ArticleId: 2,
  Title: "2",
  Reviewers: [
    {
       "Reviewer": "abc",
       "Status": "Approved"
    },
    {
       "Reviewer": "def",
       "Status": "Approved"
    }
  ]
}

{
  ArticleId: 3,
  Title: "2",
  Reviewers: [
    {
       "Reviewer": "def",
       "Status": "Approved"
    }
  ]
}

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

{
 ...
 buckets:[{
        "doc_count": "1",
        "Key": "Pending"
    },{
        "doc_count": "1",
        "Key": "Approved"
    }]
}

Мне было интересно, как это сделать в ES?


person Thomas    schedule 02.09.2020    source источник


Ответы (1)


Предположение. Рецензенты — это вложенный тип.

Попробуйте запрос ниже. Подробности в виде комментариев в коде.

 {
  "size": 0, 
  "aggs": {
    "NAME": {
      "nested": {              // <========== Use nested aggregation
        "path": "Reviewers"
      },
      "aggs": {
        "NAME": {
          "filter": {
            "term": {
              "Reviewers.Reviewer.keyword": "abc" // <========= Filter docs with reviewer = abc
            }
          },
          "aggs": {
            "NAME": {
              "terms": {
                "field": "Reviewers.Status.keyword", // <======= aggregate based on reviewer status
                "size": 10
              }
            }
          }
        }
      }
    }
  }
}
person Sahil Gupta    schedule 03.09.2020