2017-01-08 4 views
0

の一部の集計は、私は、このブールクエリを持っていると言います。Elasticsearchブールクエリ

ここで、最初の用語に一致したすべてのドキュメントで集計を実行できる方法はありますか?

たとえば、Sandraという名前の誰もが持つ「賞」というユニークな値をすべて取得したいと考えています。通常、私はちょうど行いたい:

"query": { 
    "match": { 
     "FirstName": "Sandra" 
    } 
}, 
"aggs": { 
    "Prizes": { 
     "terms": { 
      "field": "Prizes" 
     } 
    } 
} 

は、2つのように私は最初の名前だけサンドラまたは姓ジョーンズを持つ人々のすべてを返す単一のクエリ、唯一の集約を実行する必要が結合する方法はあります最初の名前のサンドラを持つ人々に?

ありがとう!

+0

どうしてそうする必要がありますか? – Lax

+0

@Laxうーん、私は名前のSandraのすべての人、姓のJonesの人、そして名前のSandraを持つすべての人に集計する必要があるので、2つではなく1つのクエリにそれらをマージできるかどうか疑問に思っていた(名前はSandra +集団、姓はJonesのすべての人)。ちょうど希望の思考私は推測する。 –

答えて

1

post_filterを使用してください。 次のクエリを参照してください。 Post_filterは、bool should節が集約スコープに影響しないことを確認します。

集約もメインクエリに基づいてフィルタリングされますが、post_filterの影響を受けません。ご希望のユースケースを達成するのを助けることができ、賞品に集約する前にaggs内部のフィルターを実行link

{ 
    "from": 0, 
    "size": 20, 
    "aggs": { 
     "filtered_lastname": { 
      "filter": { 
       "query": { 
        "match": { 
         "FirstName": "sandra" 
        } 
       } 
      }, 
      "aggs": { 
       "prizes": { 
        "terms": { 
         "field": "Prizes", 
         "size": 10 
        } 
       } 
      } 
     } 
    }, 
    "post_filter": { 
     "bool": { 
      "should": [{ 
       "term": { 
        "FirstName": "Sandra" 
       } 
      }, { 
       "term": { 
        "LastName": "Jones" 
       } 
      }], 
      "minimum_should_match": 1 
     } 
    } 
} 

を参照してください。

ありがとう ほしいと思っています。