2013-04-09 28 views
5

Tôi có hàng trăm nghìn tài liệu trong chỉ mục elasticsearch với các vĩ độ và kinh độ liên quan (được lưu trữ dưới dạng các loại geo_point). Tôi muốn có thể tạo hình ảnh bản đồ trông giống như sau: http://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.388.htmlPhân cụm không gian địa lý với elasticsearch

Vì vậy, tôi nghĩ điều tôi muốn là chạy truy vấn có hộp giới hạn (ví dụ: ranh giới bản đồ mà người dùng đang xem) và trả về một bản tóm tắt các cụm trong hộp giới hạn này. Có cách nào tốt để thực hiện điều này trong elasticsearch? Một chiến lược lập chỉ mục mới có lẽ? Một cái gì đó giống như geohashes có thể làm việc, nhưng nó sẽ cụm những thứ vào một lưới hình chữ nhật, chứ không phải là đa giác tùy ý dựa trên mật độ điểm như đã thấy trong ví dụ trên.


@kumetix - Câu hỏi hay. Tôi đang trả lời nhận xét của bạn ở đây vì văn bản quá dài để đưa vào nhận xét khác. Cài đặt geohash_precision sẽ quy định độ chính xác tối đa mà tại đó tổng hợp geohash sẽ có thể trả lại. Ví dụ, nếu geohash_precision được đặt thành 8, chúng ta có thể chạy một tập hợp geohash trên trường đó với độ chính xác cao nhất 8. Điều này, theo số reference, kết quả trả về được nhóm trong các hộp geohash khoảng 38.2m x 19m. Độ chính xác 7 hoặc 8 có thể đủ chính xác để hiển thị bản đồ nhiệt dựa trên web như bản đồ tôi đã đề cập trong ví dụ trên.

Theo như cách geohash_precision ảnh hưởng đến nội bộ cụm, tôi đoán cài đặt lưu trữ một chuỗi geohash có độ dài < = geohash_precision bên trong geo_point. Hãy nói rằng chúng ta có một điểm tại Tượng Nữ thần Tự do: 40.6892, -74.0444. Geohash12 cho điều này là: dr5r7p4xb2ts. Thiết geohash_precision trong geo_point đến 8 trong nội bộ sẽ lưu trữ các chuỗi: d dr DR5 dr5r dr5r7 dr5r7p dr5r7p4 dr5r7p4x

và geohash_precision 12 sẽ bổ sung trong nội bộ lưu trữ các chuỗi: dr5r7p4xb dr5r7p4xb2 dr5r7p4xb2t dr5r7p4xb2ts

dẫn đến chi phí lưu trữ cao hơn một chút cho mỗi điểm geo_point. Đặt geohash_precision thành một giá trị khoảng cách (1km, 1m, v.v.) có thể chỉ lưu trữ nó ở giá trị độ dài chuỗi chính xác geohash gần nhất.

Lưu ý: Làm thế nào để tính toán geohashes sử dụng python

$ pip install python-geohash 
>>> import geohash 
>>> geohash.encode(40.6892,-74.0444) 
'dr5r7p4xb2ts' 

Trả lời

3

Trong Elasticsearch 1.0, bạn có thể sử dụng Geohash Grid tập hợp mới.

Thứ gì đó giống như geohashes có thể hoạt động, nhưng nó sẽ xếp mọi thứ vào một lưới hình chữ nhật, thay vì đa giác tùy ý dựa trên mật độ điểm như trong ví dụ trên.

Điều này đúng, nhưng tập hợp lưới geohash xử lý dữ liệu thưa thớt tốt, vì vậy tất cả những gì bạn cần là đủ điểm trên lưới và bạn có thể đạt được điều gì đó tương tự như ví dụ trên bản đồ đó.

+0

này hoạt động tuyệt vời - cảm ơn! –

+0

hey @DanNoble, DrTech. một trong các bạn có thể giải thích hiệu ứng của giá trị được đặt cho 'geohash_precision' khi thiết lập ánh xạ không? trong [tham chiếu] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-geo-point-type.html#_mapping_options), chúng cho biết giá trị 'Đặt độ chính xác geohash. Nó có thể được đặt thành độ dài geohash tuyệt đối hoặc giá trị khoảng cách (ví dụ: 1km, 1m, 1ml) xác định kích thước của ô nhỏ nhất. Mặc định là chiều dài tuyệt đối là 12. 'Chính xác thì kích thước của ô nhỏ nhất này có ảnh hưởng đến cụm mà chúng ta quay lại không? – kumetix

+1

@kumetix - câu hỏi hay! xem câu hỏi cập nhật của tôi –

1

Hãy thử điều này:

https://github.com/triforkams/geohash-facet

Chúng tôi đã sử dụng nó để làm server-side clustering và nó khá tốt.

Ví dụ truy vấn:

GET /things/thing/_search 
{ 
    "size": 0, 
    "query": { 
     "filtered": { 
      "filter": { 
       "geo_bounding_box": { 
        "Location" 
        : { 
         "top_left": { 
          "lat": 45.274886437048941, 
          "lon": -34.453125 
         }, 
         "bottom_right": { 
          "lat": -35.317366329237856, 
          "lon": 1.845703125 
         } 
        } 
       } 
      } 
     } 
    }, 
    "facets": { 
     "places": { 
     "geohash": { 
      "field": "Location", 
      "factor": 0.85 
     } 
     } 

    } 
} 
+0

Plugin này trông giống như nó sẽ làm việc tốt cho trường hợp sử dụng của tôi, nhưng như DrTech đã đề cập, tập hợp lưới geohash hiện đang được hỗ trợ nguyên bản. –

+1

plugin này là khác nhau để geohash bản địa vì nó điều chỉnh chính nó để mật độ btw ... –

Các vấn đề liên quan