Я пытаюсь выполнить некоторые агрегации с 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. Существует составная агрегация , но я не думаю, что мы можем заказать с помощью субагрегаций.