2017-09-04 219 views
3

我在Elasticsearch中獲得了大量數據。我的douments有一個名爲「記錄」的嵌套字段,其中包含具有多個字段的對象列表。Elasticsearch聚合嵌套內部匹配

我希望能夠從記錄列表中查詢特定對象,因此我在查詢中使用inner_hits字段,但它沒有幫助,因爲聚合使用大小0,因此不會返回結果。

我沒有成功地僅爲inner_hits進行聚合工作,因爲聚合返回記錄中所有對象的結果,而不管查詢。

這是我使用的查詢: (每個文檔都有first_timestamp和last_timestamp領域,並在記錄列表中的每個對象都有一個時間戳字段)

curl -XPOST 'localhost:9200/_msearch?pretty' -H 'Content-Type: application/json' -d'  
{ 
    "index":[ 
     "my_index" 
    ], 
    "search_type":"count", 
    "ignore_unavailable":true 
} 
{ 
    "size":0, 
    "query":{ 
     "filtered":{ 
      "query":{ 
       "nested":{ 
        "path":"records", 
        "query":{ 
         "term":{ 
          "records.data.field1":"value1" 
         } 
        }, 
        "inner_hits":{} 
       } 
      }, 
      "filter":{ 
       "bool":{ 
        "must":[ 
        { 
         "range":{ 
          "first_timestamp":{ 
           "gte":1504548296273, 
           "lte":1504549196273, 
           "format":"epoch_millis" 
          } 
         } 
        } 
        ], 
       } 
      } 
     } 
    }, 
    "aggs":{ 
     "nested_2":{ 
      "nested":{ 
       "path":"records" 
      }, 
      "aggs":{ 
       "2":{ 
        "date_histogram":{ 
          "field":"records.timestamp", 
          "interval":"1s", 
          "min_doc_count":1, 
          "extended_bounds":{ 
           "min":1504548296273, 
           "max":1504549196273 
          } 
        } 
       } 
      } 
     } 
    } 
}' 

回答

3

您的查詢是非常複雜的。 短,這裏是你的請求的查詢:

{ 
    "size": 0, 
    "aggregations": { 
    "nested_A": { 
     "nested": { 
     "path": "records" 
     }, 
     "aggregations": { 
     "bool_aggregation_A": { 
      "filter": { 
      "bool": { 
       "must": [ 
       { 
        "term": { 
        "records.data.field1": "value1" 
        }  
       } 
       ] 
      } 
      }, 
      "aggregations": { 
      "reverse_aggregation": { 
       "reverse_nested": {}, 
       "aggregations": { 
       "bool_aggregation_B": { 
        "filter": { 
        "bool": { 
         "must": [ 
         { 
          "range": { 
          "first_timestamp": { 
           "gte": 1504548296273, 
           "lte": 1504549196273, 
           "format": "epoch_millis" 
          } 
          } 
         } 
         ] 
        } 
        }, 
        "aggregations": { 
        "nested_B": { 
         "nested": { 
         "path": "records" 
         }, 
         "aggregations": { 
         "my_histogram": { 
          "date_histogram": { 
          "field": "records.timestamp", 
          "interval": "1s", 
          "min_doc_count": 1, 
          "extended_bounds": { 
           "min": 1504548296273, 
           "max": 1504549196273 
          } 
          } 
         } 
         } 
        } 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

現在,讓我來解釋每一步聚集的名字:

  • 大小:0 - >我們不感興趣的命中,只集合
  • nested_A - >data.field1是下記錄,以便我們深入我們的範圍,以記錄
  • bool_aggregation_A - >過濾器由data.field1:數值
  • reverse_aggregation - >first_timestamp不是嵌套文檔中,我們需要範圍出從記錄
  • bool_aggregation_B - >過濾器由first_timestamp範圍
  • nested_B - >現在,我們範圍再次成用於timestamp字段記錄(位於下記錄)
  • my_histogram - >最後,聚合日期直方圖由timestamp字段
+1

漂亮!這正是我的意思。 – hanetz