ElasticSearch và Geospatial search
Mục đích của entry này không đi sâu vào tất cả các khía cạnh của ElasticSearch mà chỉ giới thiệu sơ lược về GeoSpatial trong search engine này.
I. Đôi điều ElasticSearch
ElasticSearch cũng giống như Apache Solr là một Lucence-based search engine. Nhưng nó linh hoạt, hiện đại và dễ sử dụng hơn Solr (xem thêm). Có thể xem bảng so sánh giữa Solr và ElasticSearch.
ElasticSearch có một số ưu điểm như sau:
- Schemaless:
- Không cần cấu hình phức tạp, ElasticSearch sẽ tự động phát hiện các kiểu dữ liệu cơ bản mà ta đưa vào. Do đó ta chỉ cần tiến hành
index
tài liệu ngay sau khi cài đặt xong. Tuy nhiên với các kiểu dữ liệu khác ngoài các kiểu dữ liệu cơ bản, nhưgeo_point
,geo_shape
thì chúng ta phải tiến hành mapping.
- Không cần cấu hình phức tạp, ElasticSearch sẽ tự động phát hiện các kiểu dữ liệu cơ bản mà ta đưa vào. Do đó ta chỉ cần tiến hành
- RESTful API
- ElasticSearch hỗ trợ thêm, xoá, sửa
indices
thông qua các phương thứcHTTP
nhưGET
,POST
,DELETE
vàPUT
, hỗ trợ params dưới dạng JSON thay vì chỉ làGET
params
.
- ElasticSearch hỗ trợ thêm, xoá, sửa
- Distributed (mà không cần cài thêm bất cứ ứng dụng nào như Apache Zookeeper)
- Near real-time search.
Để hiểu rõ về cơ chế indexing
của các search engine thì có thể xem lại các bài trước về inverted index
ở đây và vector space model
và ở đây. Xem cách cài đặt ElasticSearch (ES) ở đây. Và xem thêm giới thiệu về ES ở đây Elasticsearch – Awesome seach and index engine
II. Tìm kiếm địa điểm trong ElasticSearch
ElasticSearch hỗ trợ mapping một số kiểu dữ liệu như là geo_point
, geo_shape
. Ngoài ra, ElasticSearch còn cung cấp các chức năng filter
và aggregation
, để giải quyết những vấn đề như: Tìm điểm gần nhất, hay thống kê có bao nhiêu điểm trong một khu vực cho trước.
Ví dụ ta mapping một cấu trúc index như sau:
Chúng ta có một số địa điểm như sau:
name | lat | lon | geohash | address |
---|---|---|---|---|
Beafsteak Nam Sơn | 10.775365 | 106.690952 | w3gv7dv8xfep | 200 Bis Nguyễn Thị Minh Khai, P. 6, Quận 3 |
Đo Đo Quán | 10.768050 | 106.688704 | w3gv7b227jbp | 10/14 Lương Hữu Khánh, P. Phạm Ngũ Lão, Quận 1 |
Chè Hà Ký | 10.754105 | 106.658514 | w3gv5jdr5qxb | 138 Châu Văn Liêm, P. 11, Quận 5 |
Cơm Gà Đông Nguyên | 10.755465 | 106.652302 | w3gv5j4tmxxu | 89-91 Châu Văn Liêm, P. 14, Quận 5 |
Nhà Hàng Sân Vườn Bên Sông | 10.831478 | 106.724668 | w3gvsef9bvzc | 7/3 Kha Vạn Cân, P. Hiệp Bình Chánh, Quận Thủ Đức |
Lẩu Dê Bình Điền | 10.869835 | 106.763260 | w3gvv6y9kk0e | 1296C Kha Vạn Cân, Quận Thủ Đức |
Có một điểm hay là chúng ta chỉ cần nhập vào lat
và long
còn geohash
thì ElasticSearch tự sinh ra.
- Geo sort
Ví dụ ta muốn tìm và sắp xếp cách địa điểm theo khoảng cách từ gần đến xa từ một vị trí đã biết kinh độ và vĩ độ:
- Geo filter
Ví dụ, chúng ta đang đứng ở dinh Độc lập có toạ độ là (10.776945451753402
,106.69494867324829
). Ta muốn lọc ra các địa điểm có xung quanh khu vực này 4km (trong ví dụ này mình muốn lấy bán kính là 4km, vì 5km sẽ chạm tới khu vực Quận 5).
, thì tiến hành truy vấn như sau:
ElasticSearch sẽ trả về các kết quả trong phạm vi bán kính 4km tính từ điểm có toạ độ được chỉ định.
- Geo aggregation
**Lưu ý, mấy cái aggregation
chỉ dùng được từ ElasticSearch 1.0.0 trở về sau
Ví dụ, thống kê tất cả geohash
giống nhau 5 ký tự đầu tiên (Tức là thống kê những địa điểm trong cùng một khu vực 5 \(km^2\))
Kết quả
- Full-text search
Ngoài ra chúng ta có thể thực hiện các câu truy vấn từ đơn giản (match) cho tới cách câu truy vấn phức tạp như:
Tìm chính xác
Tìm gần đúng
III. Giới thiệu về geohash
Bình thường thì để xác định toạ độ của một điểm bất kỳ trên bản đồ thì ta dùng kinh độ (longtitude) và vĩ độ (latitude). Geohash là một hệ thống mã base-32 thay thế, để thể hiện kinh độ và vĩ độ thay vì dưới dạng số thì dưới dạng kết hợp giữa chữ và số. Bằng cách không ngừng chia nhỏ bản đồ thành những ô vuông được đánh ký hiệu (bao gồm 0-9-a-z). Ví dụ geohash của dinh Độc Lập là w3gv7cvnryzz
(10.776945451753402
,106.69494867324829
).
Đối với kinh độ và vĩ độ thì độ chính xác cũng khá quan trọng, nếu chúng ta thu gọn toạ độ trên thành 10.77
và 106.69
thì nó sẽ lệch đi một khoảng 1.3km (Hẻm 150 Nguyễn Trãi thay vì số 8 Huyền Trân Công Chúa). Cái này chúng ta có thể kiểm tra bằng Google Maps.
Và những khu vực lân cận 20 \(km^2\) của dinh Độc Lập sẽ có cùng prefix là w3gv
, do đó dùng geohash rất có lợi nếu như muốn tìm những địa điểm gần với một điểm đã biết dùng inverted index
. Cũng như kinh độ và vĩ độ, geohash càng dài thì vị trí càng chính xác.
GeoHash length | Area height x width |
---|---|
1 | 5,009.4km x 4,992.6km |
2 | 1,252.3km x 624.1km |
3 | 156.5km x 156km |
4 | 39.1km x 19.5km |
5 | 4.9km x 4.9km |
6 | 1.2km x 609.4m |
7 | 152.9m x 152.4m |
8 | 38.2m x 19m |
9 | 4.8m x 4.8m |
10 | 1.2m x 59.5cm |
11 | 14.9cm x 14.9cm |
12 | 3.7cm x 1.9cm |
IV. Kết luận
ElasticSearch là một giải pháp tìm kiếm vô cùng tiện lợi và hiệu quả, không chỉ để ứng dụng làm full-text search engine thông thường mà còn giúp giải quyết dễ dàng các vấn đề tìm kiếm trong không gian (spatial search). Tuy triển khai nhanh và dễ dàng nhưng nó cũng là một giải pháp lâu dài cho các ứng dụng location based
. Foursquare là một trong những công ty tiên phong chuyển từ Solr sang ElasticSearch từ tháng 8-2012. Ngoài ra nhiều công ty công nghệ khác như Github, Soundclound cũng sử dụng ElasticSearch phục vụ cho việc tìm kiếm của mình.
References:
- Elastic Search
- “geo distance filter”, n.d <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-geo-distance-filter.html>
- “geohash grid aggregation”, n.d <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-bucket-geohashgrid-aggregation.html>
- Một số tiện ích
- Một số bài viết liên quan
- Gauth, 2012, “Find closest subway station with ElasticSearch” <http://gauth.fr/2012/09/find-closest-subway-station-with-elasticsearch/>
- Florian Hopf, 2014, Use Cases for Elasticsearch: Geospatial Search” <http://blog.florian-hopf.de/2014/08/use-cases-for-elasticsearch-geospatial.html>
- ckendell, n.d, “How To Install Elasticsearch on an Ubuntu VPS”, <https://www.digitalocean.com/community/tutorials/how-to-install-elasticsearch-on-an-ubuntu-vps>
- holdenkarau & adamalix, 2012, “foursquare now uses Elastic Search (and on a related note: Slashem also works with Elastic Search)!” <http://engineering.foursquare.com/2012/08/09/foursquare-now-uses-elastic-search-and-on-a-related-note-slashem-also-works-with-elastic-search/>