2017-09-04 1 views
3

J'ai reçu une grande quantité de données dans Elasticsearch. Mes doublons ont un champ imbriqué appelé "enregistrements" qui contient une liste d'objets avec plusieurs champs. Je veux pouvoir interroger des objets spécifiques à partir de la liste des enregistrements, et donc j'utilise le champ inner_hits dans ma requête, mais cela n'aide pas parce que l'agrégation utilise la taille 0 donc aucun résultat n'est retourné.Agrégation Elasticsearch sur les hits internes imbriqués

Je n'ai pas réussi à effectuer une agrégation uniquement pour inner_hits, car l'agrégation renvoie des résultats pour tous les objets dans les enregistrements, quelle que soit la requête.

C'est la requête que je utilise: (Chaque document a first_timestamp et champs last_timestamp, et chaque objet dans la liste des enregistrements a un champ d'horodatage)

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 
          } 
        } 
       } 
      } 
     } 
    } 
}' 

Répondre

3

Votre requête est assez complexe. Pour être bref, voici votre requête portait sur:

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

Maintenant, laissez-moi vous expliquer toutes les étapes par les noms des agrégations:

  • taille: 0 -> nous ne sommes pas intéressés à coups sûrs, seulement agrégations
  • nested_A ->data.field1 est sous les dossiers afin de nous plonger notre portée aux dossiers
  • bool_aggregation_A -> filtre par data.field1: valeur1
  • reverse_aggregation ->first_timestamp est pas dans le document imbriqué, nous avons besoin de champ à partir de dossiers
  • bool_aggregation_B -> Filtre par first_timestamp gamme
  • nested_B -> maintenant, nous portée à nouveau dans les dossiers pour le champ timestamp (sous dossiers)
  • my_histogram -> enfin, histogramme date globale par timestamp champ
+1

belle! C'est exactement ce que je voulais dire. – hanetz