Elasticsearch, термины aggs в соответствии с вложенными полями - PullRequest
1 голос
/ 23 января 2020

Elasticsearch v7.5

Привет и хорошего дня!

У нас есть 2 индекса с именами socialmedia и влияющих

Пример содержимого:

socialmedia :

{
    '_id' : 1001,
    'title' : "Title 1",
    'smp_id' : 1,
    "latest" : [
        {
          "soc_mm_score" : "5",
        }
    ]
},
{
    '_id' : 1002,
    'title' : "Title 2",
    'smp_id' : 2,
    "latest" : [
        {
          "soc_mm_score" : "10",
        }
    ]
},
{
    '_id' : 1003,
    'title' : "Title 3",
    'smp_id' : 3,
    "latest" : [
        {
          "soc_mm_score" : "35",
        }
    ]
},
{
    '_id' : 1004,
    'title' : "Title 4",
    'smp_id' : 2,
    "latest" : [
        {
          "soc_mm_score" : "30",
        }
    ]
}

// опущены некоторые другие поля

влияет :

{
    '_id' : 1,
    'name' : "John",
    'smp_id' : 1
},
{
    '_id' : 2,
    'name' : "Peter",
    'smp_id' : 2
},
{
    '_id' : 3,
    'name' : "Mark",
    'smp_id' : 3
}

Теперь у меня есть этот простой запрос, который определяет, какие документы в индексе socialmedia имеют наибольшее значение latest.soc_mm_score , а также отображает их соответствующие влияет на определяется smp_id

GET socialmedia/_search
{
  "size": 0,
  "_source": "latest", 
  "query": {
    "match_all": {}
  }, 
  "aggs": {
    "LATEST": {
      "nested": {
        "path": "latest"
      },
      "aggs": {
        "MM_SCORE": {
          "terms": {
            "field": "latest.soc_mm_score",
            "order": {
              "_key": "desc"
            },
            "size": 3
          },
          "aggs": {
            "REVERSE": {
              "reverse_nested": {},
              "aggs": {
                "SMP_ID": {
                  "top_hits": {
                    "_source": ["smp_id"], 
                    "size": 1
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

ВЫБОР ВЫБОРА :

"aggregations" : {
    "LATEST" : {
      "doc_count" : //omitted,
      "MM_SCORE" : {
        "doc_count_error_upper_bound" : //omitted,
        "sum_other_doc_count" : //omitted,
        "buckets" : [
          {
            "key" : 35,
            "doc_count" : 1,
            "REVERSE" : {
              "doc_count" : 1,
              "SMP_ID" : {
                "hits" : {
                  "total" : {
                    "value" : 1,
                    "relation" : "eq"
                  },
                  "max_score" : 1.0,
                  "hits" : [
                    {
                      "_index" : "socialmedia",
                      "_type" : "index",
                      "_id" : "1003",
                      "_score" : 1.0,
                      "_source" : {
                        "smp_id" : "3"
                      }
                    }
                  ]
                }
              }
            }
          },
          {
            "key" : 30,
            "doc_count" : 1,
            "REVERSE" : {
              "doc_count" : 1,
              "SMP_ID" : {
                "hits" : {
                  "total" : {
                    "value" : 1,
                    "relation" : "eq"
                  },
                  "max_score" : 1.0,
                  "hits" : [
                    {
                      "_index" : "socialmedia",
                      "_type" : "index",
                      "_id" : "1004",
                      "_score" : 1.0,
                      "_source" : {
                        "smp_id" : "2"
                      }
                    }
                  ]
                }
              }
            }
          },
          {
            "key" : 10,
            "doc_count" : 1,
            "REVERSE" : {
              "doc_count" : 1,
              "SMP_ID" : {
                "hits" : {
                  "total" : {
                    "value" : 1,
                    "relation" : "eq"
                  },
                  "max_score" : 1.0,
                  "hits" : [
                    {
                      "_index" : "socialmedia",
                      "_type" : "index",
                      "_id" : "1002",
                      "_score" : 1.0,
                      "_source" : {
                        "smp_id" : "2"
                      }
                    }
                  ]
                }
              }
            }
          }
        ]
      }
    }
  }

с запросом выше, I удалось успешно отобразить , какие документы имеют самые высокие значения latest.soc_mm_score

В приведенном выше примере вывода отображаются только ДОКУМЕНТЫ , сообщающие, что влияющих (aka smp_id) , связанных с ними, являются ТОП-ВЛИЯНИЯМИ согласно latest.soc_mm_score

В идеале, просто используя этот запрос aggs,

"terms" : {
    "field" : "smp_id"
}

отображает понятие, которые влияют на top в соответствии с doc_count

Теперь отображение запроса условий в соответствии с latest.soc_mm_score отображает ТОП ДОКУМЕНТОВ

"terms" : {
    "field" : "latest.soc_mm_score"
}

РЕАЛЬНАЯ ЦЕЛЬ :

Я хочу отобразить TOP INFLUENCERS в соответствии с latest.soc_mm_count в индексе socialmedia . Если Elasticsearch может подсчитать все документы, где в соответствии с уникальным smp_id, есть ли у ES способ суммировать все latest.soc_mm_score значений и использовать его как терминов ?

Моя цель выше должна вывести это:

  • smp_id 2 в качестве Top Influencer, потому что у него есть 2 поста (с soc_mm_score 30 и 10), добавление которых дает ему 40 soc_mm_score
  • smp_id 3 как 2-й главный влиятельный человек, он имеет 1 пост с 35 soc_mm_score
  • smp_id 1 как 3-й главный влиятельный человек, у него есть 1 сообщение с 5 soc_mm_score

Есть ли правильный запрос для удовлетворения эта цель?

1 Ответ

0 голосов
/ 17 февраля 2020

НАКОНЕЦ! НАЙДИТЕ ОТВЕТ !!!

"aggs": {
    "INFS": {
      "terms": {
        "field": "smp_id.keyword",
        "order": {
          "LATEST > SUM_SVALUE": "desc"
        }
      },
      "aggs": {
        "LATEST": {
          "nested": {
            "path": "latest"
          },
          "aggs": {
            "SUM_SVALUE": {
              "sum" : {
                "field": "latest.soc_mm_score"
              }
            }
          }
        }
      }
    }
}

Отображает следующий образец:

FINAL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...