2017-09-26 70 views
0

我使用彈性搜索2.我有一個大型的位置數據庫,它們都具有gps屬性,它是一個geopoint。 我的前端應用程序顯示帶有結果的谷歌地圖組件,並通過我的查詢進行過濾,比如說pizza。問題是數據集增長很多,客戶甚至希望在地圖上獲得結果。因此,如果我在紐約搜索具體的查詢,我想在紐約各地都有結果,但是我目前只在曼哈頓的一個人口稠密地區獲得400個結果。彈性搜索 - 均勻分佈在地圖上

我幼稚的方法是隻是距離

{ 
    "size":400, 
    "query":{ 
     "bool":{ 
     "must":{ 
      "match_all":{ 

      } 
     }, 
     "filter":{ 
      "geo_distance":{ 
       "distance":"200km", 
       "gps":[ 
        -73.98502023369585, 
        40.76195656809083 
       ] 
      } 
     } 
     } 
    } 
} 

這並不能保證結果將在整個地圖被擴散濾光片。 我該怎麼辦?

我試着使用Geo-Distance Aggregation

{ 
    "size":400, 
    "query":{ 
     "bool":{ 
     "must":{ 
      "match_all":{ 

      } 
     }, 
     "filter":{ 
      "geo_distance":{ 
       "distance":"200km", 
       "gps":[ 
        -73.98502023369585, 
        40.76195656809083 
       ] 
      } 
     } 
     } 
    }, 
    "aggs":{ 
     "per_ring":{ 
     "geo_distance":{ 
      "field":"gps", 
      "unit":"km", 
      "origin":[ 
       -73.98502023369585, 
       40.76195656809083 
      ], 
      "ranges":[ 
       { 
        "from":0, 
        "to":100 
       }, 
       { 
        "from":100, 
        "to":200 
       } 
      ] 
     } 
     } 
    } 
} 

但我只是收到一個結果列表+屬於桶元素的量。結果列表不保證傳播。

"aggregations": { 
    "per_ring": { 
     "buckets": [ 
      { 
       "key": "*-100.0", 
       "from": 0, 
       "from_as_string": "0.0", 
       "to": 100, 
       "to_as_string": "100.0", 
       "doc_count": 33821 
      }, 
      { 
       "key": "100.0-200.0", 
       "from": 100, 
       "from_as_string": "100.0", 
       "to": 200, 
       "to_as_string": "200.0", 
       "doc_count": 6213 
      } 
     ] 
    } 
} 

我想從一個桶中取出一半的結果,一半從另一個桶中取出。

我也試圖使用Geohash Grid Aggregation,但那也不會給我每個桶的結果樣本,只是提供了區域。

那麼如何通過一個彈性搜索查詢獲得遍佈我的地圖的間隔分佈的結果?

謝謝!

+0

請問您的文檔數遠遠超過400限制你提供?我想知道索引順序是否與你的傳播有關,因爲據我可以告訴你沒有根據距離進行評分,而只是一個未分類的過濾器。 – Miek

+0

是的,我有大約五十萬個物體。我應該根據距離進行得分嗎? – tkcast

+0

我在想你可以做那樣的事情。也許執行範圍在0-100之間的查詢,然後是範圍在101-200之間的另一個查詢等,並將大小限制爲符合您的近似分佈目標的某些內容,可能映射多個結果集?我會擔心使用這種方法誤導分配。 – Miek

回答

0

我認爲引入一些隨機性可能會給你想要的結果。我假設你因爲索引排序而看到相同的分佈(你不是基於距離得分,而是你拿到了前400個,所以你最有可能看到相同的結果集)。

{ 
    "size": 400, 
    "query": { 
    "function_score": { 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "match_all": {} 
      } 
      ], 
      "filter": { 
      "geo_distance": { 
       "distance": "200km", 
       "gps": [ 
       -73.98502023369585, 
       40.76195656809083 
       ] 
      } 
      } 
     } 
     }, 
     "functions": [ 
     { 
      "random_score": {} 
     } 
     ] 
    } 
    } 
} 

+1

這是一個好主意!它解決了我的問題。非常感謝你! – tkcast

+0

很高興:) – Miek