2016-11-20 15 views
0

Я начинаю в ElasticSearch. Я пытаюсь проверить, существует ли список геоинформации (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» для значений lat/lon в одно и то же время? – Val

+0

@fylie благодарит, что это работает для нас, на самом деле мы работаем над большими документами с большим количеством данных (позиций), и когда мы пытаемся добавить эти документы непосредственно из расширения смысла. Он блокирует, так что лучшее решение для добавления этих больших данных к elasticsearch, а также как оптимизировать время запроса, потому что для получения результата потребуется время. – Taybou

+0

@Val, я попытался ввести поле geo_point для значений lat/lon, но я получаю сообщение об ошибке, говоря, что я не мог этого сделать, потому что позиции состоят из многих других полей. – Taybou