2017-09-12 11 views
0

私はこれを理解するために頑張った。私のような時間を持つレコードとGPSを持っている:GPSのElasticSearch集約交差点

{ID: 1,Time:"2017-01-1",gps:{lat:38.00,lon:-79.00}}, 
{ID: 2,Time:"2017-01-1",gps:{lat:38.00,lon:-79.00}}, 
{ID: 1,Time:"2017-01-2",gps:{lat:39.00,lon:-77.00}}, 
{ID: 2,Time:"2017-01-2",gps:{lat:20.00,lon:-20.00}}, 
{ID: 1,Time:"2017-01-3",gps:{lat:20.00,lon:-20.00}}, 
{ID: 3,Time:"2017-01-1",gps:{lat:20.00,lon:-20.00}}, 
.......... 

私が円を描くと地域を選択することができますマップを持っています。現在、選択した場所のANYに表示されているレコードを簡単に照会して集計できます。これは例です:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "geo_distance": { 
      "distance": 56100.0, 
      "gps": { 
       "lat": 38, 
       "lon": -79 
      } 
      } 
     }, 
     { 
      "geo_distance": { 
      "distance": 56100.0, 
      "gps": { 
       "lat": 39, 
       "lon": -77 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "aggs": { 
    "by_record_id":{ 
     "terms": { 
     "field": "id" 
     } 
    } 
    } 
} 

しかし、私は選択肢の交差点を取得するにはちょっと困惑しています。 (注:サークルは重複していません)。本質的に、私は両方のサークルに登場したgps値を持つレコードの集計をしたいと思います。たとえば、上記のレコードでは、ID = 1(ID = 2とID = 3は両方の円に表示されないため)の集計結果のみを必要とします。

クエリを{"query":{"bool":{"must":[...]}}}に変更すると、結果は得られません。明らかに、2つの場所に同時にレコードが表示されないためです。

function_score(関数内の各場所の配置)やスコアの利用(さまざまなスコアの種類に基づく)など、さまざまなことを試してみました。さらに、top_hits、cardinality(precision_threshold)、cardinalityを持つbucket_selectorでフィルタリングするなど、さまざまな集約の組み合わせを試しました。

これはSQLでは非常に簡単で明白です。 elasticsearch nubeを手伝ってください。

+0

私はこれについて書面でメモしました。 'must'を使うことはできません。結果は返されません。 – Andrew

+0

ohhh私は今参照してください。私はあなたがバケットセレクターpiplineアグリゲーションを使用することができると思います あなたはそれを見ることができます[ここ](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-pipeline-bucket-selector-aggregation .html)。 構文がちょっと面倒ですが、 – tomas

+0

の場合はelasticsearchリンクよりも優れた例が必要でしょうか?個別のフィルタ/用語を作成する必要がありますか(例:1つの場所にフィルタをかける/ IDに集約する)?したがって私の場合、私はloc1とloc2を持っていますか? bucket_selectorを使って交差点を計算しますか? スクリプトはどのように動作させるのですか? – Andrew

答えて

0

答えが見つかりました!

"aggs": { 
    "ids": { 
    "terms": { 
     "field": "ID" 
    }, 
    "aggs": { 
    "the_filter": { 
     "bucket_selector": { 
     "buckets_path": { 
      "the_doc_count": "_count" 
     }, 
     "script": "params.the_doc_count >= 2" 
     } 
     } 
    } 
    } 
} 
+0

私はこれを試しましたが、私はスクリプトのセクションがうまくいかないと思います。具体的には、_count> = 2を探します。レコードが範囲内に1回しか表示されない場合は、これが機能するようです。しかし、時間の経過とともに、その記録は何度も同じ範囲に現れることがあります。そのような私は、各場所の結果にパスをバケツする必要がありますそこからユニオン/交差点のいくつかの並べ替えを実行する? – Andrew

+0

私はこの問題を解決するためにデータのインデックスを作成する方法を変更する必要があると思います – tomas