2016-11-20 68 views
0

我是ElasticSearch的初學者。我試圖測試一個geopoints(lat/long)列表是否存在於一個地址列表中。尋找能夠幫助我的人ElasticSearch

比如我給這個的GeoPoint:

"lat": 49.01536940596998 
"lon": 2.4967825412750244 

,我想測試此點在下面的列表中存在。謝謝。

"positions": [ 
    { 
     "millis": 12959023, 
     "lat": 49.01525113731623, 
     "lon": 2.4971945118159056, 
     "rawX": -3754, 
     "rawY": 605, 
     "rawVx": 0, 
     "rawVy": 0, 
     "speed": 9.801029291617944, 
     "accel": 0.09442740907572084, 
     "grounded": true 
    }, 
    { 
     "millis": 12959914, 
     "lat": 49.01536940596998, 
     "lon": 2.4967825412750244, 
     "rawX": -3784, 
     "rawY": 619, 
     "rawVx": -15, 
     "rawVy": 7, 
     "speed": 10.841861737855924, 
     "accel": -0.09534648619563282, 
     "grounded": true 
    } 
... 
} 

回答

1

爲了能夠在對象數組中搜索,您需要使用nested data type。正如鏈接頁面所解釋的,爲了保持數組的內部元素獨立,您不能使用默認映射。首先,你將不得不更新映射。

注意:映射僅對新索引生效。現在Reference.

PUT YOUR_INDEX 
{ 
    "mappings": { 
    "YOUR_TYPE": { 
     "properties": { 
     "positions": { 
      "type": "nested" 
     } 
     } 
    } 
    } 
} 

我們可以通過查詢數據。你正在尋找一個bool query,它結合了其他查詢(在你的情況下,term queries)。

POST _search 
{ 
    "query": { 
    "nested": { 
     "path": "positions", 
     "query": { 
     "bool" : { 
      "must" : [ 
      { "term" : { "lat": 49.01536940596998 } }, 
      { "term" : { "lon": 2.4967825412750244 } } 
      ] 
     } 
     } 
    } 
    } 
} 
+2

由於您正在修改映射,爲什麼不同時爲緯度/經度值引入'geo_point'字段呢? – Val

+0

@fylie感謝它爲我們工作,實際上我們正在處理一個有大量數據(位置)的大文檔,並且當我們試圖直接從感覺擴展中添加這些文檔時,它會阻止,所以添加這些大數據的最佳解決方案是什麼彈性搜索以及如何優化請求時間,因爲獲得結果需要時間。 – Taybou

+0

@Val,我試着爲緯度/經度值引入一個'geo_point'字段,但我得到的錯誤告訴我,我無法這樣做,因爲位置由許多其他字段組成 – Taybou