Elasticsearch перегруппировать и сортировать данные по агрегации - PullRequest
3 голосов
/ 30 апреля 2019

Я пытаюсь выполнить некоторые агрегации с ElasticSearch. Вот мой картографический пример:

PUT example
{
  "mappings": {
    "properties": {
      "domain": {
        "type": "keyword"
      },
      "keyword": {
            "type": "keyword"
      },
      "rank": {
            "type": "long"
      },
      "ts": {
            "type": "date"
      }
       }
  }
}

Каждый документ представляет позицию домена веб-сайта для ключевого слова на определенную дату. Так, например, если у меня есть 2 веб-сайта, apple.com и microsoft.com, с двумя разными позициями для ключевого слова «компьютер», у меня будет 2 документа для каждого домена с ключевым словом «компьютер». Если я получу документы без агрегации, у меня будет:

"_source" : {
      "keyword" : "computer",
      "domain" : "apple.com",
      "ts" : "2019-04-30",
      "rank" : 12
}

"_source" : {
      "keyword" : "computer",
      "domain" : "microsoft.com",
      "ts" : "2019-04-30",
      "rank" : 9
}

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

+----------+---------------+-----------+
|          | microsoft.com | apple.com |
+----------+---------------+-----------+
| computer |             9 |        12 |
+----------+---------------+-----------+

Мне нужно, чтобы объединение можно было разбить на страницы и отсортировать (по ключевому слову, рангу Microsoft или рангу Apple ..)

У вас есть идеи, как мне этого добиться? Я сделал агрегацию ниже, но я не знаю, как ее отсортировать.

{
  "size": 0,
  "aggs": {
    "terms_keyword": {
      "composite": {
        "sources": [
          {
            "keyword": {
              "terms": {
                "field": "keyword"
              }
            }
          }
        ]
      },
      "aggs": {
        "domain_terms": {
          "terms": {
            "field": "domain"
          },
          "aggs": {
            "doc": {
              "top_hits": {
                "size": 1
              }
            }
          }
        }
      }
    }
  }
}

С результатом:

  "aggregations" : {
    "terms_keyword" : {
      "after_key" : {
        "keyword" : "computer"
      },
      "buckets" : [
        {
          "key" : {
            "keyword" : "computer"
          },
          "doc_count" : 2,
          "domain_terms" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : "apple.com",
                "doc_count" : 1,
                "doc" : {
                  "hits" : {
                    "total" : {
                      "value" : 12,
                      "relation" : "eq"
                    },
                    "max_score" : 1.0,
                    "hits" : [
                      {
                        "_index" : "example",
                        "_type" : "_doc",
                        "_id" : "1g1jWmoB9OyOTfm4a8kE",
                        "_score" : 1.0,
                        "_source" : {
                          "keyword" : "computer",
                          "domain" : "apple.com",
                          "ts" : "2019-04-30",
                          "rank" : 12
                        }
                      }
                    ]
                  }
                }
              },
              {
                "key" : "microsoft.com",
                "doc_count" : 1,
                "doc" : {
                  "hits" : {
                    "total" : {
                      "value" : 1,
                      "relation" : "eq"
                    },
                    "max_score" : 1.0,
                    "hits" : [
                      {
                        "_index" : "example",
                        "_type" : "_doc",
                        "_id" : "2Q1jWmoB9OyOTfm4tMl3",
                        "_score" : 1.0,
                        "_source" : {
                          "keyword" : "computer",
                          "domain" : "microsoft.com",
                          "ts" : "2019-04-30",
                          "rank" : 9
                        }
                      }
                    ]
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }

Возможно, я не использую правильный метод, я открыт для любых предложений.

Спасибо

EDIT:

Хорошо, благодаря этому посту мне удалось продвинуться Как сгруппировать результаты вasticsearch?

Я использовал Функция свертывания полей в агрегации топ-хитов , и теперь я могу перегруппироваться по ключевому слову и сортировать по двум категориям доменов с подгруппами:

{
  "size": 0, 
  "aggs": {
    "top": {
      "terms": {
        "field": "keyword",
        "order": {
          "_key": "desc"
        }
      },
      "aggs": {
        "top_tags_hits": {
          "top_hits": {}
        },
        "min_rank_apple": {
          "min": {
            "script": {
              "source": "if (doc.domain.value == \"apple.com\") { doc.rank.value } else { 101 }"
            }
          }
        },
        "min_rank_microsoft": {
          "min": {
            "script": {
              "source": "if (doc.domain.value == \"microsoft.com\") { doc.rank.value } else { 101 }"
            }
          }
        }
      }
    }
  }
}

Я могу изменить порядок в терминах агрегации по ключевому слову , min_rank_apple или min_rank_microsoft . Но я все еще не могу разбить на страницы из-за терминов Aggs. Существует составная агрегация , но я не думаю, что мы можем заказать с помощью субагрегаций.

...