2016-02-08 67 views
-1

我有一個項目,使用戶能夠使用Elasticsearch搜索POI,並且它們可以通過許多不同的屬性(包括位置)進行過濾。我想爲所有的過濾器添加分面,其中大部分是分面變量,這些分面是完美的。不過,我也希望用戶能夠通過位置/城市/城市區域來面向。每個位置都是經緯度/長度對。Elasticsearch中的地理定位(集羣)

從我的研究中,似乎最好的方法是使用經緯度對的k均值聚類來獲取最常見的分面位置分組。一旦我有了這些分組,我想爲該地區提供最常見的名稱(例如,即使「布魯克林」是集羣的中心,我想提供名稱「紐約市」)。 (a)在Elasticsearch中可以進行地理聚類(k-means,或其他任何方式),以允許按位置分面?如果是這樣,怎麼樣?如果沒有,這可以在Postgres中完成嗎? (b)如何確保我爲聚類返回的任何給定地區提供最廣泛認可的政治名稱?

+0

都不擅長羣集。 K-means也是一個相當差的選擇。 (你如何設置K,並防止它穿過布魯克林?) –

+0

@ Anony-Mousse,顯然我不是這方面的專家。你會推薦什麼方法? – jdotjdot

回答

1

由於緯度/長(或地址)作爲輸入,您可以使用Google Maps Geocoding API檢索(和索引)的特定層次範圍的標籤:

  • 國家
  • administrative_area_level_1(狀態:美國)
  • administrative_area_level_2(縣:在美國)
  • sublocality_level_1(市鎮:在NYC)
  • administrative_area_level_3(市:在美國)
  • 地方(居委會:在美國)

如果你正在構建出具有放大地圖部件的Yelp的或製作的Airbnb類似的搜索界面,您可以選擇哪個位置方面顯示基於一些標準的多樣性:


eg請求所有6個術語,但只顯示具有適當選擇多樣性的術語(例如2-10個術語)...例如,如果您的縮放級別(和邊界框)包括布魯克林,曼哈頓和史坦頓島,那麼您將看到以下內容:

  • 國家(美國)... 忽略,過於寬泛
  • administrative_area_level_1(New York)... 忽略,過於寬泛
  • administrative_area_level_2(Kings County, New York County, Richmond County)... 忽略(就紐約市而言,sublocality_level_1更合適mmonly使用)
  • sublocality_level_1:(Brooklyn, Manhattan, Staten Island)... 適當特定,顯示此!
  • administrative_area_level_3(New York City)... 忽略,過於寬泛
  • 地區(<100s of neighborhoods>)...忽略,太窄