2013-04-19 10 views
16

Giả sử chúng tôi có một loạt tài liệu trong chỉ mục ElasticSearch. Mỗi tài liệu có nhiều địa điểm trong một mảng, như thế này:Bộ lọc khoảng cách địa lý của ElasticSearch với nhiều vị trí trong mảng - có thể?

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

Theo ElasticSearch reference guide

bộ lọc geo_distance thể làm việc với nhiều địa điểm/chỉ mỗi tài liệu. Khi một vị trí/điểm duy nhất phù hợp với bộ lọc, tài liệu sẽ được bao gồm trong bộ lọc.

Vì vậy, có thể tạo bộ lọc khoảng cách địa lý để kiểm tra tất cả các vị trí trong mảng không?

này dường như không làm việc, không may:

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

ném "QueryParsingException[[myIndex] failed to find geo_point field [locations]" vì locations không phải là một đơn geo_point nhưng một mảng của geo_point s.

Trả lời

23

Bạn có chỉ định geo_point mapping cho tài liệu của mình không?

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

Vâng, có bản đồ geo_point cho các địa điểm. – Max

+0

Sau đó, nó sẽ làm việc, xem ví dụ của tôi. Bạn sử dụng phiên bản ES nào? Tôi đã thử nghiệm nó trên 0,20,6. – Thorsten

+1

Thực ra, nó * hiện * hoạt động ngay sau khi nuking chỉ mục gốc. Chỉ định một ánh xạ geo_point và sau đó chỉ cần chèn một mảng các vị trí đã làm các trick, lập bản đồ trước của tôi là quá phức tạp. Cảm ơn rất nhiều! – Max

3

Đối Elasticsearch phiên bản 5.1, cho cùng một chỉ số trên, truy vấn sẽ đi như thế này,

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