Подтвердить что ты не робот

Агрегировать только согласованные значения вложенных объектов в ElasticSearch

Мне нужно суммировать только значения для вложенных объектов, которые соответствуют запросу. Похоже, ElasticSearch определяет документы, соответствующие запросу, а затем суммирует все вложенные объекты. Из нижеследующего плана я хочу выполнить поиск по nestedobjects.objtype = "A" и вернуть сумму objvalue только для соответствия nestedobjects, я хочу получить значение 4. возможно ли это? Если да, то как?

Вот отображение

{
  "myindex": {
    "mappings": {
      "mytype": {
        "properties": {
           "nestedobjects": {
             "type": "nested",
             "include_in_parent": true,
             "properties": {
               "objtype": {
                 "type": "string"
               },
               "objvalue": {
                 "type": "integer"
               }
             }
           }
         }
       }
     }
   }
 }

Вот мои документы

PUT /myindex/mytype/1
{
  "nestedobjects": [
    { "objtype": "A", "objvalue": 1 },
    { "objtype": "B", "objvalue": 2 }
  ]
}
PUT /myindex/mytype/2
{
  "nestedobjects": [
    { "objtype": "A", "objvalue": 3 },
    { "objtype": "B", "objvalue": 3 }
  ]
}

Вот мой код запроса.

POST allscriptshl7/_search?search_type=count
{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "nestedobjects.objtype:A"
        }
      }
    }
  },
  "aggregations": {
    "my_agg": {
      "sum": {
        "field": "nestedobjects.objvalue"
      }
    }
  }
}
4b9b3361

Ответ 1

Так как оба (внешние) документы соответствуют условию соответствия одного из их внутренних документов запросу, оба внешних документа возвращаются, и агрегация вычисляется против всех внутренних документов, принадлежащих этим внешним документам. Уф.

Во всяком случае, похоже, это похоже на то, что вы хотите, я думаю, используя агрегацию фильтров:

POST /myindex/_search?search_type=count
{
   "aggs": {
      "nested_nestedobjects": {
         "nested": {
            "path": "nestedobjects"
         },
         "aggs": {
            "filtered_nestedobjects": {
               "filter": {
                  "term": {
                     "nestedobjects.objtype": "a"
                  }
               },
               "aggs": {
                  "my_agg": {
                     "sum": {
                        "field": "nestedobjects.objvalue"
                     }
                  }
               }
            }
         }
      }
   }
}
...
{
   "took": 4,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0,
      "hits": []
   },
   "aggregations": {
      "nested_nestedobjects": {
         "doc_count": 4,
         "filtered_nestedobjects": {
            "doc_count": 2,
            "my_agg": {
               "value": 4,
               "value_as_string": "4.0"
            }
         }
      }
   }
}

Вот какой код я использовал для его проверки:

http://sense.qbox.io/gist/c1494619ff1bd0394d61f3d5a16cb9dfc229113a

Очень хорошо структурированный вопрос, кстати.