2015-04-03 38 views
3

我正在使用彈性搜索1.4.1 - 1.4.4。我試圖將地理多邊形形狀(文檔)索引到索引中,現在當索引形狀時,我想知道地理座標是否位於該特定索引的地理多邊形形狀的邊界內。如何知道彈性搜索中的地理座標是否位於地理多邊形內?

GET /city/_search 
{ 
"query":{ 
    "filtered" : { 
     "query" : { 
      "match_all" : {} 
     }, 
     "filter" : { 
      "geo_polygon" : { 
       "location" : { 
        "points" : [ 
         [72.776491, 19.259634], 
         [72.955705, 19.268060], 
         [72.945406, 19.189611], 
         [72.987291, 19.169507], 
         [72.963945, 19.069596], 
         [72.914506, 18.994300], 
         [72.873994, 19.007933], 
         [72.817689, 18.896882], 
         [72.816316, 18.941052], 
         [72.816316, 19.113720], 
         [72.816316, 19.113720], 
         [72.790224, 19.192205], 
         [72.776491, 19.259634] 
        ] 
       } 
      } 
     } 
    } 
} 
} 

隨着上述地理多邊形過濾器我能得到所有收錄的地理座標位於描述多邊形內,但我也需要知道,如果一個非索引與該地理多邊形或沒有地理座標所在。我的疑問是,如果這在1.4.1的彈性搜索中是可能的。

+0

你是說你希望能夠發佈一個具有某個地理位置的查詢,並獲取一個返回值,指出它是否位於此前發佈的多邊形內? – GlenRSmith 2015-04-03 12:31:54

+0

是的。 @GlenRSmith – 2015-04-03 13:09:15

+3

然後,您需要調查滲流。 基本上,您會將實際查詢編入索引器,就像多邊形過濾器查詢一樣,然後您將文檔發佈到_percolate端點,並返回返回的結果(如您擁有地理座標的文檔)將會指出哪些過濾後的查詢會因此而返回您的文檔。 – GlenRSmith 2015-04-03 18:46:44

回答

4

是的,過濾器可以用來解決這個問題。

與Elasticsearch的正常使用情況一樣,我們將文檔編入elasticsearch,然後對索引數據運行查詢以檢索匹配的/必需的文檔。

但過濾器的工作方式不同。

在Percolators中,您註冊了您的查詢,然後通過註冊查詢滲透您的文檔,並取回與您的文檔相匹配的查詢。

經歷無數的谷歌搜索結果和許多博客後,我無法找到任何可以解釋我如何使用percolator來解決這個問題的事情。

所以我用一個例子來解釋這一點,以便其他面臨同樣問題的人可以從我的問題和我找到的解決方案中獲得提示。我想如果有人可以改進我的答案或者可以分享一個更好的方法來做到這一點。

例如: -

首先我們需要創建一個索引。

PUT /city/ 

然後,我們需要添加一個映射,其包括用戶的 經緯度的滲透對註冊用戶的查詢文件。

PUT /city/user/_mapping 
{ 
    "user" : { 
     "properties" : { 
      "location" : { 
       "type" : "geo_point" 
      } 
     } 
    } 
} 

現在,我們可以將我們的地理多邊形查詢註冊爲帶有id的過濾器作爲城市名稱或您想要的任何其他標識符。

PUT /city/.percolator/mumbai 
{ 
    "query":{ 
     "filtered" : { 
      "query" : { 
       "match_all" : {} 
      }, 
      "filter" : { 
       "geo_polygon" : { 
        "location" : { 
         "points" : [ 
          [72.776491, 19.259634], 
          [72.955705, 19.268060], 
          [72.945406, 19.189611], 
          [72.987291, 19.169507], 
          [72.963945, 19.069596], 
          [72.914506, 18.994300], 
          [72.873994, 19.007933], 
          [72.817689, 18.896882], 
          [72.816316, 18.941052], 
          [72.816316, 19.113720], 
          [72.816316, 19.113720], 
          [72.790224, 19.192205], 
          [72.776491, 19.259634] 
         ] 
        } 
       } 
      } 
     } 
    } 
} 

讓我們註冊另一個地理多邊形過濾其他城市

PUT /city/.percolator/delhi 
{ 
    "query":{ 
     "filtered" : { 
      "query" : { 
       "match_all" : {} 
      }, 
      "filter" : { 
       "geo_polygon" : { 
        "location" : { 
         "points" : [ 
          [76.846998, 28.865160], 
          [77.274092, 28.841104], 
          [77.282331, 28.753252], 
          [77.482832, 28.596619], 
          [77.131269, 28.395064], 
          [76.846998, 28.865160] 
         ] 
        } 
       } 
      } 
     } 
    } 
} 

現在我們已經註冊了2個查詢作爲滲濾壺,我們可以確保通過使該API調用。

GET /city/.percolator/_count 

現在要知道任何註冊城市是否存在地理位置點,我們可以使用下面的查詢滲透用戶文檔。

GET /city/user/_percolate 
{ 
    "doc": { 
     "location" : { 
      "lat" : 19.088415, 
      "lon" : 72.871248 
      } 
      } 
} 

這將返回:_id爲 「孟買」

{ 
    "took": 25, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "total": 1, 
    "matches": [ 
     { 
     "_index": "city", 
     "_id": "mumbai" 
     } 
    ] 
} 

試圖用不同的緯度和經度另一個查詢

GET /city/user/_percolate 
{ 
    "doc": { 
     "location" : { 
      "lat" : 28.539933, 
      "lon" : 77.331770 
      } 
      } 
    } 

這將返回:_id爲 「新德里」

{ 
    "took": 25, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "total": 1, 
    "matches": [ 
     { 
     "_index": "city", 
     "_id": "delhi" 
     } 
    ] 
} 

讓我們運行另一個查詢random lat-lon

GET /city/user/_percolate 
{ 
    "doc": { 
     "location" : { 
      "lat" : 18.539933, 
      "lon" : 45.331770 
      } 
      } 
} 

並且此查詢將返回無匹配結果。

{ 
    "took": 5, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "total": 0, 
    "matches": [] 
} 
+1

你的方式拯救我的生命:) – 2017-07-04 00:59:15

相關問題