2016-03-31 5 views
0

У меня есть следующие отображения:ElasticSearch: поля доступа внешнего документа из внутри вложенного агрегированного запроса

{ 
    "dynamic": "strict", 
    "properties": { 
     "id": { 
      "type": "string" 
     }, 
     "title": { 
      "type": "string" 
     }, 
     "things": { 
      "type": "nested", 
      "properties": { 
       "id": { 
        "type": "long" 
       }, 
       "something": { 
        "type": "long" 
       } 
      } 
     } 
    } 
} 

вставить документы следующим образом (Python скрипт):

body = {"id": 1, "title": "one", "things": [{"id": 1000, "something": 33}, {"id": 1001, "something": 34}, ]} 
es.create(index_name, doc_type=doc_type, body=body, id=1) 

body = {"id": 2, "title": "two", "things": [{"id": 1000, "something": 43}, {"id": 1001, "something": 44}, ]} 
es.create(index_name, doc_type=doc_type, body=body, id=2) 

body = {"id": 3, "title": "three", "things": [{"id": 1000, "something": 53}, {"id": 1001, "something": 54}, ]} 
es.create(index_name, doc_type=doc_type, body=body, id=3) 

бегает следующее агрегирование запрос :

{ 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "things": { 
     "aggs": { 
     "num_articles": { 
      "terms": { 
      "field": "things.id", 
      "size": 0 
      }, 
      "aggs": { 
      "articles": { 
       "top_hits": { 
       "size": 50 
       } 
      } 
      } 
     } 
     }, 
     "nested": { 
     "path": "things" 
     } 
    } 
    }, 
    "size": 0 
} 

(так, я хочу подсчет количества раз, когда появляется каждая вещь, а против каждой вещи список статей, в которых появляется каждая вещь)

Запрос производит:

"key": 1000, 
"doc_count": 3, 
"articles": { 
    "hits": { 
     "total": 3, 
     "max_score": 1, 
     "hits": [{ 
      "_index": "test", 
      "_type": "article", 
      "_id": "2", 
      "_nested": { 
       "field": "things", 
       "offset": 0 
      }, 
      "_score": 1, 
      "_source": { 
       "id": 1000, 
       "something": 43 
      } 
     }, { 
      "_index": "test", 
      "_type": "article", 
      "_id": "1", 
      "_nested": { 
       "field": "things", 
       "offset": 0 
      }, 
      "_score": 1, 
      "_source": { 
       "id": 1000, 
       "something": 33 
      } 

.... (и так далее)

То, что я хотел бы для каждого попадание в список все поля из «внешнего» или верхнего уровня документа, то есть в этом случае id и title.

Это действительно возможно ..... и если да, то как ???

ответ

0

Я не уверен, если это то, что вы ищете, но давайте дадим ему попробовать:

{ 
    "query": { 
    "match_all": {} 
    }, 
    "aggs": { 
    "nested_things": { 
     "nested": { 
     "path": "things" 
     }, 
     "aggs": { 
     "num_articles": { 
      "terms": { 
      "field": "things.id", 
      "size": 0 
      }, 
      "aggs": { 
      "articles": { 
       "top_hits": { 
       "size": 50 
       } 
      }, 
      "reverse_things": { 
       "reverse_nested": {}, 
       "aggs": { 
       "title": { 
        "terms": { 
        "field": "title", 
        "size": 0 
        } 
       }, 
       "id": { 
        "terms": { 
        "field": "id", 
        "size": 0 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Это создает что-то вроде этого:

  "buckets": [ 
       { 
        "key": 1000, 
        "doc_count": 3, 
        "reverse_things": { 
        "doc_count": 3, 
        "id": { 
         "buckets": [ 
          { 
           "key": "1", 
           "doc_count": 1 
          }, 
          { 
           "key": "2", 
           "doc_count": 1 
          }, 
          { 
           "key": "3", 
           "doc_count": 1 
          } 
         ] 
        }, 
        "title": { 
         ... 
        } 
        }, 
        "articles": { 
        "hits": { 
         "total": 3, 
         "max_score": 1, 
         "hits": [ 
          { 
           "_index": "test", 
           "_type": "article", 
           "_id": "AVPOgQQjgDGxUAMojyuY", 
           "_nested": { 
           "field": "things", 
           "offset": 0 
           }, 
           "_score": 1, 
           "_source": { 
           "id": 1000, 
           "something": 53 
           } 
          }, 
          ... 
+0

почти ... .. –

+0

Проблема состоит в том, что в разделе '' 'reverse_things'' перечислены id и заголовок, но не в том же порядке. Таким образом, ключ для ID являются 1,2,3 "Идентификатор": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "ковши": [{ "ключ" : "1", "doc_count": 1 }, { "ключ" : "2", "doc_count": 1 }, { "ключ" : "3", "doc_count": 1 }] }, –

+0

Но ключ для названия - это один, три, два. "Название": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "ведра": [{ "ключ" : "один", "doc_count": 1 }, клавиша { » «: "три", "doc_count": 1 }, { "ключ": "два", "doc_count": 1 }] } Если заказ может быть вынужден соответствовать с оригинальными статьями, это сработает. Спасибо @ kristian-ferkić, кстати ... –

 Смежные вопросы

  • Нет связанных вопросов^_^