2014-09-03 183 views
0

這只是一個簡單的問題。我打算將我的搜索系統更改爲elasticsearch。如果我送elasticsearch三條信息在我的要求:使用Elasticsearch進行地理搜索

  • 緯度
  • 距離

而且我elasticsearch結果標註了以下信息:

是否有可能只在該距離內返回結果而無需額外的彈性搜索插件?這個功能是否內置在elasticsearch中?

回答

1

是的,在三個非常簡單的步驟。您必須映射數據(如設置數據庫模式),插入數據,然後搜索它(過濾器)。

您必須正確映射該字段,以便將其識別爲geo_point。注意:如果您想要更靈活地存儲其他類型的地理位置(例如多邊形或線串),那麼您可能想將其映射爲geo_shape

{ 
    "mappings" : { 
    "TYPE_NAME" : { 
     "properties" : { 
     "fieldName" : { "type" : "geo_point" } 
     } 
    } 
    } 
} 

一旦映射,您可以使用point type插入位置詳細信息。

{ 
    "fieldName" : { 
    "type" : "point", 
    "coordinates" : [ longitude, latitude ] 
    } 
} 

您可以鍵入不同,以達到相同的效果,但也許更直觀地(而不是[X,Y],這是不是最常見的地理空間順序)。

{ 
    "fieldName" : { 
    "type" : "point", 
    "coordinates" : { 
     "lat" : latitude, 
     "lon" : longitude 
    } 
    } 
} 

無論哪種方式,它將代表相同的東西(在過濾器中同樣如此)。

當您映射領域,並開始接入點,那麼你就可以運行geo_distance filter所需distance內找點:

{ 
    "filtered" : { 
    "query" : { "match_all" : {} }, 
    "filter" : { 
     "geo_distance" : { 
     "distance" : "10mi", 
     "fieldName" : [ longitude, latitude ] 
     } 
    } 
    } 
}