7

次のようなデータがあるユースケースがあります

{
    name: "John",
    parentid": "1234",
    filter: {a: '1', b: '3', c: '4'}
},
{
    name: "Tim",
    parentid": "2222",
    filter: {a: '2', b: '1', c: '4'}
},
{
    name: "Mary",
    parentid": "1234",
    filter: {a: '1', b: '3', c: '5'}
},
{
    name: "Tom",
    parentid": "2222",
    filter: {a: '1', b: '3', c: '1'}
}

予想された結果:

bucket:[{
    key: "2222",
    hits: [{
        name: "Tom" ...
    }, 
    {
        name: "Tim" ...
    }]
},
{
    key: "1234",
    hits: [{
        name: "John" ...
    },
    {
        name: "Mary" ...
    }]
}]

で一意のドキュメントを返したいparentid。トップアグリゲーションを使用できますが、バケットをページ分割する方法がわかりません。parentid同じよりも異なる可能性が高いためです。したがって、私のバケット配列は大きくなり、それらすべてを表示したいのですが、それらをページ付けします。

4

2 に答える 2

1

これを行う直接的な方法はありません。ただし、これらの手順に従って、目的の結果を得ることができます。

ステップ 1.すべてを知っている必要がありますparentid。このデータは、フィールドで単純なterms aggregation(詳細はこちらを参照)を実行することで取得でき、それに一致するドキュメントではなくparentid、のリストのみが取得されます。parentid最終的には、現在期待しているよりも小さいアレイが表示されます。

{
  "aggs": {
    "parentids": {
      "terms": {
        "field": "parentid",
        "size": 0 
      }
    }
  }
}

size: 0 すべての結果を返すために必要です。詳細はこちらをご覧ください

また

すべてのリストをすでに知っている場合parentidは、直接ステップ 2 に進むことができます。

ステップ 2.ドキュメントをフィルタリングして関連ドキュメントを取得しparentid、ここでページネーションを適用できます。

{
  "from": 0,
  "size": 20, 
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "parentid": "2222"
        }
      }
    }
  }

}

fromおよびsizeページネーションに使用されるため、リスト内のそれぞれをループして、parentid関連するすべてのドキュメントを取得できます。

于 2016-08-08T12:37:10.330 に答える