2015-02-17 4 views
1

Несколько слов о схеме, у меня есть один тип документа (обзоры), который содержит список отзывов (вложенный объект), каждый обзор имеет следующие поля: полярность (отрицательная или противоположная), ключевое слово (основное слово обзора), рецензент. моя цель - найти верхнее отрицательное и положительное ключевое слово и для каждого ключевого слова найти счетчик его противоположности (если ключевое слово было на верхнем позитиве, мне нужно найти отрицательный счетчик для ключевого слова)Вложенная агрегация Elasticseach

например (на основе данные, представленные ниже)

  • сверху отрицательное
    • iphone - 2
      • напротив счетчик (положительный) - 2
    • Samsung - 1
      • напротив счетчик (положительный) - 0
  • сверху положительным
    • iphone - 2
      • напротив счетчик (отрицательный) - 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 
         } 
        ] 
        } 
       } 
      ] 
     } 
     } 
    } 

ответ

1

Почему бы вам не выполнить агрегацию, сводящую уровни агрегации. Firt агрегат по ключевым словам, а затем по полярности -

POST forum_poc/_search?search_type=count 
{ 
    "aggs": { 
    "aggregation": { 
     "nested": { 
     "path": "Reviews" 
     }, 
     "aggs": { 
     "polarity": { 
      "terms": { 
      "field": "keyword", 
      "size": 10 
      }, 
      "aggs": { 
      "keyword": { 
       "terms": { 
       "field": "polarity", 
       "size": 10 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Спасибо за ваш ответ, теперь, когда у меня есть топ-10 ключевых слов каждой полярности мне нужно подсчитать их противоположную полярность, и его не обязательно, что они будут появляться и в топ 10 их дерева противоположной полярности. и я стараюсь избегать приведения всех возможных результатов без ограничения размера. – Grigory