Несколько слов о схеме, у меня есть один тип документа (обзоры), который содержит список отзывов (вложенный объект), каждый обзор имеет следующие поля: полярность (отрицательная или противоположная), ключевое слово (основное слово обзора), рецензент. моя цель - найти верхнее отрицательное и положительное ключевое слово и для каждого ключевого слова найти счетчик его противоположности (если ключевое слово было на верхнем позитиве, мне нужно найти отрицательный счетчик для ключевого слова)Вложенная агрегация Elasticseach
например (на основе данные, представленные ниже)
- сверху отрицательное
- iphone - 2
- напротив счетчик (положительный) - 2
- Samsung - 1
- напротив счетчик (положительный) - 0
- iphone - 2
- сверху положительным
- iphone - 2
- напротив счетчик (отрицательный) - 2
- iphone - 2
Заранее благодарим за вас.
Схема:
curl -XPOST "http://localhost:9200/forum_poc" -d
{
"settings": {
"number_of_shards": 9,
"number_of_replicas": 1
},
"mappings": {
"_default_": {
"_all": {
"enabled": false
},
"_source": {
"enabled": true
},
"dynamic": "false"
},
"ReviewEvent": {
"_source": {
"enabled": true
},
"properties": {
"Reviews": {
"type": "nested",
"include_in_parent": true,
"properties": {
"polarity": {
"type": "string",
"index": "not_analyzed",
"store": "true"
},
"reviewer": {
"type": "string",
"index": "not_analyzed",
"store": "true"
},
"keyword": {
"type": "string",
"index": "not_analyzed",
"store": "true"
}
}
}
}
}
}
}
Данные:
curl -XPOST "http://localhost:9200/forum_poc" -d
{"index":{"_index":"forum_poc","_type":"ReviewEvent","_id":0}}
{"Reviews":[{"polarity":"negative","reviewer":"jhon","keyword":"iphone"},{"polarity":"negative","reviewer":"kevin","keyword":"samsung"}]}
{"index":{"_index":"forum_poc","_type":"ReviewEvent","_id":1}}
{"Reviews":[{"polarity":"positive","reviewer":"Doron","keyword":"iphone"}]}
{"index":{"_index":"forum_poc","_type":"ReviewEvent","_id":2}}
{"Reviews":[{"polarity":"negative","reviewer":"Michel","keyword":"iphone"}]}
{"index":{"_index":"forum_poc","_type":"ReviewEvent","_id":4}}
{"Reviews":[{"polarity":"positive","reviewer":"Afi","keyword":"iphone"}]}
Мой запрос:
POST forum_poc/_search?search_type=count
{
"aggs": {
"aggregation": {
"nested": {
"path": "Reviews"
},
"aggs": {
"polarity": {
"terms": {
"field": "polarity",
"size": 10
},
"aggs": {
"keyword": {
"terms": {
"field": "keyword",
"size": 10
}
}
}
}
}
}
}
}
я нужен обратный отсчет для каждого ключевого слова.
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 9,
"successful": 9,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 0,
"hits": []
},
"aggregations": {
"aggregation": {
"doc_count": 5,
"polarity": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "negative",
"doc_count": 3,
"keyword": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "iphone",
"doc_count": 2
},
{
"key": "samsung",
"doc_count": 1
}
]
}
},
{
"key": "positive",
"doc_count": 2,
"keyword": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "iphone",
"doc_count": 2
}
]
}
}
]
}
}
}
Спасибо за ваш ответ, теперь, когда у меня есть топ-10 ключевых слов каждой полярности мне нужно подсчитать их противоположную полярность, и его не обязательно, что они будут появляться и в топ 10 их дерева противоположной полярности. и я стараюсь избегать приведения всех возможных результатов без ограничения размера. – Grigory