本文介绍如何创建一个使用谷歌地图和Elasticsearch的MVC应用程序进行geo_distance搜索,并找到最近的点(文档)到您的位置。
Elasticsearch索引使用geo_point来定义每个文档的位置。Elasticsearch支持GeoJson格式。
Elasticsearch索引和类型使用以下模型创建:
DetailsCoordinates属性使用GeoPoint类,用于geo_distance搜索。 Elasticsearch中的映射使用ElasticsearchCRUD的IndexCreate方法创建。 Elasticsearch中的Geo类型如果是geo_point,则需要一个ElasticsearchGeoPoint属性,如果它是一个shape 类型,则需要一个ElasticsearchGeoShape属性。 必须映射Geo属性,并在索引新文档时不能自动创建。
可以使用以下方式查看映射:
一旦创建了索引和类型,就会使用_bulk API添加一些数据。 这些文件都使用SaveChanges()方法发送。
Elasticsearch中的索引和类型在global.asax Application_Start方法中初始化。 这将检查索引是否存在,并创建一个新的索引(如果没有)。
使用geo_distance filter 和 query查询索引。 这将搜索最大距离内的所有文档,并从最接近您的搜索位置的升序排序命中结果。
上面的Elasticsearch 查询看起来像这样在C#
然后在HomeController中使用它,如下所示:
razor 索引视图使用此数据在地图显示中。 使用绿色图像显示与您的搜索位置最接近的文档。 最大搜索距离内的所有命中也显示在地图中。 您可以移动您的中心位置,增加或减少最大允许距离,结果将被正确显示。
搜索后的应用程序视图:
结论
您可以看到,使用Elasticsearch进行Geo搜索很容易。 支持一系列Geo搜索过滤器,地理边界框过滤器,地理距离过滤器,地理距离范围过滤器,地理多边形过滤器,GeoShape过滤器,Geohash信元过滤器(Geo Bounding Box Filter, Geo Distance Filter, Geo Distance Range Filter, Geo Polygon Filter, GeoShape Filter, Geohash Cell Filter)以及大多数geoJSON形状和GeoShape查询。 可以创建最优搜索以匹配大多数要求。