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"
}
}
}
}
}