2016-05-03 12 views
0

I Index diese:Elasticsearch - verwenden bucket Schlüssel als Filtervariable

POST nephi/boat/1 
{ 
    "plates": { 
     "id": 123, 
     "type": "brass" 
    }, 
    "compass": { 
     "id": 123, 
     "name": "liahona" 
    } 
} 

POST nephi/boat/2 
{ 
    "plates": { 
     "id": 100, 
     "type": "brass" 
    }, 
    "compass": { 
     "id": 234, 
     "name": "liahona" 
    } 
} 

Ich benutze diese Suchabfrage, so kann ich eine Aggregation tun, wo plates.id und compass.id gleich sind:

POST nephi/boat/_search 
{ 
    "aggs": { 
     "terms_agg": { 
     "terms": { 
      "field": "plates.id" 
     }, 
     "aggs": { 
      "filter_agg": { 
       "filter": { 
        "term": { 
        "compass.id": 123 
        } 
       } 
      } 
     } 
     } 
    }, 
    "size": 0 
} 

Statt mit "compass:id": 123, würde ich gerne in der Lage sein, eine Variable anstelle von 123, wie "compass:id": "__bucket_key" zu verwenden, wobei __bucket_key 123 auf dem ersten Dokument oben und 100 auf dem zweiten Dokument oben verweisen würde (die plates.id s).

Ist so etwas möglich?

+0

Sie möchten auf plates.id aggregieren, wobei 'plates.id == compass.id' ?? – Richa

+0

@Richa, ja. Es mag in diesem Beispiel albern erscheinen, aber ich möchte das tun, damit ich eine weitere Metrik-Unteraggregation (wie count oder sum) durchführen kann, nur für Dokumente, bei denen '' 'plates.id == compass.id''' steht . – chevin99

Antwort

0

Gemäß Ihrer Anforderung müssen Sie nicht auf plates.id aggregieren. Versuchen Sie es mit Script Query:

"filter": { 
    "script": { 
     "script": "doc['plates.id'].value == doc['compass.id'].value" 
    } 
} 

Dies wird holen Sie alle diese Dokumente, die gleichen Platten und Kompass-ID haben. Dann können Sie metric aggregation oder so anwenden.

Stellen Sie sicher, dass Sie die Skripterstellung aktivieren.

+0

Ich hoffte, in der Lage zu sein, das zu erreichen, was ich ohne Skripting brauche, aber ich muss vielleicht so etwas tun. Vielen Dank. – chevin99

Verwandte Themen