問題

Elasticsearchに大量のデータがあります。私のdoumentsには、いくつかのフィールドを持つオブジェクトのリストを含む「レコード」というネストされたフィールドがあります。

レコードリストから特定のオブジェクトを照会できるようにしたいので、クエリで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
                          }
                     }
                }
           }
      }
   }
}'
 

  ベストアンサー

あなたの質問はかなり複雑です。 要するに、要求されたクエリは次のとおりです。

 {
  "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
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
 

さて、私はすべてのステップをaggregationsの名前で説明しましょう:

  • サイズ:0 - >ヒットには興味がありません。
  • nested_A - > data.field1はレコードの下にあるので、スコープをレコードにダイビングします
  • bool_aggregation_A - > data.field1でフィルタリングする:value1
  • reverse_aggregation - > first_timestampはネストされたドキュメントにありません。レコードからスコープアウトする必要があります
  • bool_aggregation_B - > first_timestampの範囲でフィルタリングする
  • nested_B - >今、timestampフィールドのレコードに再度スコープします(レコードの下にあります)
  • my_histogram - >最後に、timestampフィールドによる日付ヒストグラムの集計

  同じタグがついた質問を見る

elasticsearchnestedaggregation