6

Elasticsearch GeoHash グリッド集約を使用してマップ クラスタリングを行っています。クエリは、平均 100 ~ 200 個のバケットを返します。各バケットは、集約されたクラスターごとに 3 つのドキュメントを返すために使用する top_hits 集約を使用します。

問題は、親の集計 (GeoHash) が 3 つ以下のドキュメントを集計する場合にのみ、 top_hits を返したいことです。

クラスターが 3 つ以上のドキュメントを集約する場合、ES がこのクラスターのドキュメントを返さないようにします (それらを使用しないため)。

Bucket Selector Aggregationを使用しようとしましたが、正しいbucket_pathを作成できませんでした。top_hits アグリゲーションと同じレベルでバケット セレクタ アグリゲーションを使用します。バケットの合計ドキュメント数は で入手できますtop_hits.hits.totalが、得られるのはreason=path not supported for [top_hits]: [hits.total]です。

これはelasticsearchで可能ですか? これは私にとって重要です。ほとんどのクエリでは、ドキュメントが 3 つ未満のバケットはごく一部しかないためです。ただし、トップ ヒット サブアグリゲーションは、1000 ドキュメントのクラスターであっても、常に上位 3 つのドキュメントを返します。クエリの結果が 200 個のバケットを返し、そのうちの 5 個のみが <= 3 ドキュメントを集約している場合、200*3 ではなく 5*3 ドキュメントのみを返す必要があります (この場合、応答は 10MB です)。

ここに私のクエリの aggs 部分があります:

"clusters": {
  "geohash_grid": {
    "field": "coordinates",
    "precision": 3
  },
  "aggs": {
    "top_hits": {
      "top_hits": {
        "size": 3
      }
    },
    "top_hits_filter": {
      "bucket_selector": {
        "buckets_path": {
          "total_hits": "top_hits._count" // tried top_hits.hits.total
        },
        "script": {
          "inline": "total_hits <= 3"
        }
      }
    }
  }
}
4

1 に答える 1