3

フィルター処理された一連のドキュメントに対して集計を実行しようとしています。ただし、フィルターの仕様では、集計を使用する必要があります (各「申請者」の最新の「テスト」)。最上位の集計はドキュメントのフィールドで実行されますが、フィルター集計が実行されたフィールドとは異なるフィールドで実行されます。

たとえば(そして、私はここで別のユーザーの質問に基づいて構築しています:最小フィールド値のクエリまたはフィルター?)。

次の一連のドキュメントがあるとします。

{ "test": 1, "applicant":1, "score":90, “topic”:”geometry”},
{ "test": 2, "applicant":2, "score":65, “topic”:”physics” },
{ "test": 3, "applicant":2, "score":88, "topic”:”geometry”},
{ "test": 4, "applicant":1, "score":23, "topic”:”english” },
{ "test": 5, "applicant”:3, "score”:50, "topic”:”physics” },
{ "test": 6, "applicant”:3, "score”:77, "topic”:”english” }

各カテゴリで最高のスコアを獲得したユーザーの数を調べることに関心があります。

つまり、次のことを行います。

  1. 各ユーザーの最高得点のテストのみをフィルタリングします
  2. トピックに基づいて結果をグループ化 (およびカウント) します。

したがって、ステップ 1 では、次のものだけを使用する必要があります。

{ "test": 1, "applicant":1, "score":90, “topic”:”geometry” },
{ "test": 3, "applicant":2, "score":88, "topic”:”geometry” },
{ "test": 5, "applicant”:3, "score”:50, "topic”:”physics”  },
{ "test": 6, "applicant”:3, "score”:77, "topic”:”english”  }

ステップ 2 では、トピックごとにグループ カウントします。

{“topic”:”geometry” , “count”: 2}
{“topic”:”physics”  , “count”: 1}
{“topic”:”english”  , “count”: 1}

問題は、フィルタリングにaggregation/top_hitsを使用する場合です:

{
  "aggs": {
    “applicants”: {
      "terms": {
        "field": “applicant”,
        "order" : { “highest_score" : "desc" }
      },
      "aggs": {
        “highest_score": { “max”: { "field": "score" }},
        “highest_score_top_hits": {
          "top_hits": {
            "size":1,
            "sort": [{"score": {"order": "desc"}}]
          }
        }
      }
    }
  }
}

最初のステップ (top_hits) は正しくできましたが、「親」集計を「トピック」で追加すると、「申請者」が異なる「トピック」バケット間で混合されるため、top_hits 集計が適切に機能しなくなります。最大スコアは不正確になります。

「トピック」集計の前にクエリ フィルターを使用するのが最善の方法のようですが、各応募者の最高得点テストのみを保持するようにそのようなフィルターを作成することはできませんでした。

何か案は?

4

0 に答える 0