2017-04-20 4 views
2

Ich habe ein Problem mit verschachtelten Aggregation in Elasticsearch. Ich habe Mapping mit verschachteltem Feld:Elasticsearch. Terms Aggregation auf geschachteltem Feld mit doppelten Werten

POST my_index/ my_type/_mapping 
{ 
    "properties": { 
     "name": { 
      "type": "keyword" 
     }, 
     "nested_fields": { 
      "type": "nested", 
       "properties": { 
       "key": { 
        "type": "keyword" 
       }, 
       "value": { 
        "type": "keyword" 
       } 
      } 
     } 
    } 
} 

Dann füge ich ein Dokument zu indizieren:

POST my_index/ my_type 
{ 
    "name":"object1", 
     "nested_fields":[ 
      { 
       "key": "key1", 
       "value": "value1" 

      }, 
      { 
       "key": "key1", 
       "value": "value2" 
      } 
     ] 
} 

Wie Sie sehen, in meiner verschachtelten Array ich zwei Teile, die zum key Feld ähnlich, aber anders value Feld. Dann möchte ich eine solche Abfrage machen:

GET/my_index/my_type/_search 
{ 
    "query": { 
     "nested": { 
      "path": "nested_fields", 
       "query": { 
       "bool": { 
        "must": [ 
         { 
          "term": { 
           "nested_fields.key": { 
            "value": "key1" 
           } 
          } 
         }, 
         { 
          "terms": { 
           "nested_fields.value": [ 
            "value1", 
            "value2" 
           ] 
          } 
         } 
        ] 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "agg_nested_fields": { 
      "nested": { 
       "path": "nested_fields" 
      }, 
      "aggs": { 
       "agg_nested_fields_key": { 
        "terms": { 
         "field": "nested_fields.key", 
          "size": 10 
        } 
       } 
      } 
     } 
    } 
} 

Wie Sie sehen, ich will alle Dokumente finden, die mindestens ein Objekt in nested_field Array haben, mit key Eigenschaft gleich key1 und einer der verfügbaren Werte (value1 oder value2). Dann möchte ich fundierte Dokumente von nested_fields.key gruppieren. Aber ich habe solche Antwort

{ 
    "took": 13, 
     "timed_out": false, 
      "_shards": { 
     "total": 5, 
      "successful": 5, 
       "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
      "max_score": 0.87546873, 
       "hits": [ 
        { 
         "_index": "my_index", 
         "_type": "my_type", 
         "_id": "AVuLNXxiryKmA7VEwOfV", 
         "_score": 0.87546873, 
         "_source": { 
          "name": "object1", 
          "nested_fields": [ 
           { 
            "key": "key1", 
            "value": "value1" 
           }, 
           { 
            "key": "key1", 
            "value": "value2" 
           } 
          ] 
         } 
        } 
       ] 
    }, 
    "aggregations": { 
     "agg_nested_fields": { 
      "doc_count": 2, 
       "agg_nested_fields_key": { 
       "doc_count_error_upper_bound": 0, 
        "sum_other_doc_count": 0, 
         "buckets": [ 
          { 
           "key": "key1", 
           "doc_count": 2 
          } 
         ] 
      } 
     } 
    } 
} 

Wie Sie aus der Antwort zu sehen, habe ich einen Treffer (es ist richtig), aber das Dokument zweimal in Aggregation gezählt wurde (siehe doc_count: 2), weil es zwei Elemente mit ' Schlüssel1 'Wert in nested_fields Array. Wie kann ich die richtige Anzahl an Aggregationen erhalten?

+0

Das ist die richtige Anzahl, da jedes verschachtelte Element ein eigenes Dokument ist. Sie haben also wirklich zwei verschachtelte Dokumente, die 'Schlüssel1' als Schlüssel und entweder' Wert1' oder 'Wert2' als Wert haben. – Val

+0

Ja, ich brauche das. Wie kann ich dieses Problem lösen? – Stalso

+0

hilft das https://stackoverflow.com/a/27578607/7379424? –

Antwort

0

Sie reverse_nested aggs innerhalb der verschachtelten Aggregation zu verwenden, haben die Aggregationszahl auf Root-Dokument zurückzukehren.

{ 
    "query": { 
     "nested": { 
      "path": "nested_fields", 
      "query": { 
       "bool": { 
        "must": [{ 
          "term": { 
           "nested_fields.key": { 
            "value": "key1" 
           } 
          } 
         }, 
         { 
          "terms": { 
           "nested_fields.value": [ 
            "value1", 
            "value2" 
           ] 
          } 
         } 
        ] 
       } 
      } 
     } 
    }, 
    "aggs": { 
     "agg_nested_fields": { 
      "nested": { 
       "path": "nested_fields" 
      }, 
      "aggs": { 
       "agg_nested_fields_key": { 
        "terms": { 
         "field": "nested_fields.key", 
         "size": 10 
        }, 
        "aggs": { 
         "back_to_root": { 
          "reverse_nested": { 
           "path": "_source" 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

Es ist auch falsch. – Stalso

+0

wie, möchten Sie die Anzahl der Eltern/root doc. ok ich bis hier verstehe ‚Wie Sie aus der Antwort sehen, ich habe einen Treffer (es ist richtig), aber das Dokument wurde zweimal in Aggregation (siehe doc_count: 2) gezählt, weil es zwei Elemente mit hat‚key1‘Wert in nested_fields-Array. Wie kann ich die richtige Anzahl an Aggregationen erhalten? Sie haben weitere Informationen hinzugefügt, was Sie erreichen möchten – user3775217

Verwandte Themen