2013-04-19 7 views
16

ElasticSearchインデックスには多数のドキュメントがあります。アレイ内に複数の場所があるElasticSearchジオ距離フィルタ - 可能ですか?

{ 
    "name": "foobar", 
    "locations": [ 
    { 
     "lat": 40.708519, 
     "lon": -74.003212 
    }, 
    { 
     "lat": 39.752609, 
     "lon": -104.998100 
    }, 
    { 
     "lat": 51.506321, 
     "lon": -0.127140 
    } 
    ] 
} 

ElasticSearch reference guide

によればgeo_distanceフィルタは、文書ごとに複数の場所/点 で動作することができる:各ドキュメントは、このような複数の場所アレイでを有しています。 1つの位置/ポイントがフィルタに一致すると、 ドキュメントがフィルタに含まれます。

したがって、配列内のすべての位置をチェックするジオ距離フィルタを作成できますか?

これは、残念ながら、動作していないよう:locationsは単一geo_pointしかしgeo_pointの配列ではありませんので、

{ 
    "filter": { 
    "geo_distance": { 
     "distance": "100 km", 
     "locations": "40, -105" 
    } 
    } 
} 

は「QueryParsingException[[myIndex] failed to find geo_point field [locations]」がスローされます。

答えて

23

ドキュメントにgeo_point mappingを指定しましたか? Elasticsearchバージョン5.1の場合

curl -XDELETE 'http://localhost:9200/twitter/' 
curl -XPUT 'http://localhost:9200/twitter/' 

curl -XPUT 'http://localhost:9200/twitter/tweet/_mapping' -d ' 
{ 
    "tweet" : { 
     "properties" : { 
      "locations" : {"type" : "geo_point"} 
     } 
    } 
}' 

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d ' 
{ 
    "user": "kimchy", 
    "postDate": "2009-11-15T13:12:00", 
    "message": "Trying out Elastic Search, so far so good?", 
    "locations" : [{ 
     "lat" : 50.00, 
     "lon" : 10.00 
    }, 
    { 
     "lat" : 40.00, 
     "lon" : 9.00 
    }] 
}' 

curl -XPUT 'http://localhost:9200/twitter/tweet/2' -d ' 
{ 
    "user": "kimchy", 
    "postDate": "2009-11-15T13:12:00", 
    "message": "Trying out Elastic Search, so far so good?", 
    "locations" : [{ 
     "lat" : 30.00, 
     "lon" : 8.00 
    }, 
    { 
     "lat" : 20.00, 
     "lon" : 7.00 
    }] 
}' 

curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d '{ 
    "query": { 
     "filtered" : { 
      "query" : { 
       "match_all" : {} 
      }, 
      "filter" : { 
       "geo_distance" : { 
        "distance" : "20km", 
        "tweet.locations" : { 
         "lat" : 40.00, 
         "lon" : 9.00 
        } 
       } 
      } 
     } 
    } 
}' 
+0

ますはい、場所についてgeo_pointマッピングがあります。 – Max

+0

それはうまくいくはずです、私の例を見てください。どのESバージョンを使用しますか?私は0.20.6でそれをテストしました。 – Thorsten

+1

実際には、元のインデックスをヌークした後には*動作します。 geo_pointマッピングを指定してから、配列の配列を挿入するだけでは、私の以前のマッピングはあまりにも複雑でした。どうもありがとう! – Max

3

、インデックス上記と同じのため、クエリは、次のように行く

curl -XGET 'http://localhost:9200/twitter/tweet/_search' -d ' 
{ 
    "query": { 
     "bool": { 
      "must": { 
       "match_all": {} 
      }, 
      "filter": { 
       "geo_distance": { 
        "distance": "200km", 
        "locations": { 
         "lat": 40.00, 
         "lon": 9.00 
        } 
       } 
      } 
     } 
    } 
}'