5

私は、Elasticsearch GeoHashグリッド集約を使用してマップクラスタリングを行っています。 クエリは平均100〜200バケットを返します。 それぞれのバケットはtop_hits集計を使用します。これは集約された各クラスタに対して3つのドキュメントを返すために使用します。合計文書に基づいてtop_hitsサブ集約をフィルタリングする

親集計(GeoHash)が3つ以上のドキュメントを集約していない場合にのみ、を返すことが問題です。

クラスタが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(Teレスポンスはこの場合は10MB)ではなく5 * 3個のドキュメントのみを返します。ここで

は、私のクエリの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

この@ilivewithianを試してみてください:

"aggs": { 
    "clusters": { 
     "geohash_grid": { 
     "field": "coordinates", 
     "precision": 3 
     }, 
     "aggs": { 
     "top_hits": { 
      "top_hits": { 
      "size": 3 
      } 
     }, 
     "top_hits_filter": { 
      "bucket_selector": { 
      "buckets_path": { 
       "total_hits": "_count" 
      }, 
      "script": { 
       "inline": "params.total_hits <= 3" 
      } 
      } 
     } 
     } 
    } 
    } 
+1

おかげで、この問題のため、我々はジオハッシュを使用して停止してきたように、それは私のために少し遅れだけれども集約。これがうまくいけば、1月にいつか見てから適切に答えをマークします。 – mbudnik

関連する問題