2014-05-14 39 views
1

我有一個用例,其中我有2種類型的位置條件的查詢(即,具有geo_point型):爲地理位置查找

  1. 位置1:具有緯度/經度與說半徑= 90英里(它將會發生變化)和類型=傳出
  2. 位置2:具有緯度/經度,沒有半徑和類型=傳入現在

,當查詢與進來:緯度/經度和半徑= 20,我期望這發生:

  1. 簡單的地理位置查詢:如果輸入緯度/經度位於位置2的20miles內,則返回位置2.
  2. 如果輸入緯度/經度位於位置1的90英里內,則返回位置1。如果您注意到,我希望輸入半徑被特定類型位置的保存半徑覆蓋。

這是我想出了利用腳本:

{ 
    "query": { 
    "match_all": {} 
    }, 
    "filter": { 
    "script": { 
     "script": "!doc['geopoint'].empty && doc['coverage_type'].value == 'outgoing' ? doc['geopoint'].distanceInMiles(37,-121) <= doc['radius'].value : doc['geopoint'].distanceInMiles(37,-121) <= 20" 
    } 
    } 
} 

其中「37,-121」是經/緯度和20的輸入是輸入半徑。

您對查詢有什麼看法,這是做這件事的最好方法嗎?

最初發布this on ES mailing list,沒有運氣。

回答

2

這對我來說似乎沒問題。另一種更詳細的方法是將腳本分解爲各種ES過濾器,以便ES儘可能優化您的請求(您可以針對您的某個案例使用特定的geo_distance過濾器)。 例如,你可以有這樣的事情:(抱歉,如果JSON是不完全一樣,我沒有辦法,現在對其進行測試)

{ 
    "query": { 
    "match_all": {} 
    }, 
    "filter": { 
    "bool": { 
     "should": [ 
      { 
       "and": [ 
        { 
         "term": { 
          "coverage_type": "outgoing" 
         } 
        }, 
        { 
         "script": { 
          "script": "!doc['geopoint'].empty && doc['geopoint'].distanceInMiles(37,-121) <= doc['radius'].value" 
         } 
        } 
       ] 
      }, 
      { 
       "and": [ 
        { 
         "term": { 
          "coverage_type": "incoming" 
         } 
        }, 
        { 
         "geo_distance" : { 
          "geopoint" : [ 37, -121 ], 
          "distance" : "20km" 
         } 
        } 
       ] 
      } 
     ] 
    } 
    } 
} 

您可能需要添加一些特定的過濾器來管理的事實您的文檔中可能缺少一個地理點,並且您想如何處理這個問題。例如,您可能希望允許一個人在沒有地理位置的情況下獲取所有文檔,在這種情況下,您可以向「應該」添加「缺失」過濾器。我希望有所幫助。