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
Есть ли правильный запрос для удовлетворения эта цель?