2016-11-20 72 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