Elasticsearch geo_shape filter нет результатов
У меня проблемы с получением моего фильтра geo_shape, который возвращает результаты при фильтрации во вложенном местоположении.
Предположим, у меня есть следующее:
PUT test/test/_mapping
{
"properties": {
"name": {
"type": "string"
},
"gatheringEvent": {
"properties": {
"siteCoordinates": {
"type": "nested",
"properties": {
"point": {
"type": "geo_shape"
}
}
}
}
},
"point": {
"type": "geo_shape"
}
}
}
Теперь, когда я индексирую следующий документ:
POST test/test/1
{
"name": "Bird",
"gatheringEvent.siteCoordinates.point": {
"type": "point",
"coordinates": [
5,
5
]
},
"point": {
"type": "point",
"coordinates": [
5,
5
]
}
}
Выполнение следующего запроса: (с использованием фильтра geo_shape в не вложенном месте)
GET test/test/_search
{
"query": {
"filtered": {
"query": {
"match": {
"name": "Bird"
}
},
"filter": {
"geo_shape": {
"point": {
"shape": {
"type": "polygon",
"coordinates": [
[
[0 ,0 ],
[10 ,0],
[10,10],
[0,10 ],
[0 ,0 ]
]
]
},
"relation": "within"
}
}
}
}
}
}
Возвращает мне свой документ, как я и ожидал.
Но при выполнении фильтра geo_shape для вложенного местоположения:
GET test/test/_search
{
"query": {
"filtered": {
"query": {
"match": {
"name": "Bird"
}
},
"filter": {
"nested": {
"path": "gatheringEvent.siteCoordinates",
"filter": {
"geo_shape": {
"gatheringEvent.siteCoordinates.point": {
"shape": {
"type": "polygon",
"coordinates": [
[
[0 ,0 ],
[10 ,0],
[10,10],
[0,10 ],
[0 ,0 ]
]
]
},
"relation": "within"
}
}
}
}
}
}
}
}
Не дает результатов..
Я также удалил вложенное отображение, потому что подумал, что это может быть проблемой, но как только поле 'point' находится внутри поля типа объекта, я не получаю результатов..
Есть мысли о том, что я здесь делаю не так??
Благодарю.
1 ответ
Есть несколько проблем, которые я вижу здесь:
- Похоже, вы хотите два уровня вложенности (если это не ошибка), поэтому вам нужно указать оба уровня в вашем отображении, если вы хотите иметь возможность использовать
nested
фильтр в вашем запросе. - Вы не можете использовать синтаксис точки при индексации документа с вложенной структурой; этот синтаксис только для запросов. Если вы посмотрите на свое сопоставление до и после индексации документа, вы увидите, что свойство верхнего уровня называется
"gatheringEvent.siteCoordinates.point"
добавляется при индексации документа, что, по-видимому, не то, что вы хотели.
Есть несколько разных способов продолжить. Вот как я смог заставить его работать. Сначала я изменил ваше отображение, включив два уровня вложенности, и создал индекс следующим образом:
DELETE /test_index
PUT /test_index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
}
}
PUT /test_index/doc/_mapping
{
"properties": {
"name": {
"type": "string"
},
"gatheringEvent": {
"type": "nested",
"properties": {
"siteCoordinates": {
"type": "nested",
"properties": {
"point": {
"type": "geo_shape"
}
}
}
}
},
"point": {
"type": "geo_shape"
}
}
}
Затем я проиндексировал ваш документ с правильной структурой для двух уровней вложенности:
POST /test_index/doc/1
{
"name": "Bird",
"gatheringEvent": [
{
"siteCoordinates": [
{
"point": {
"type": "point",
"coordinates": [5, 5]
}
}
]
}
],
"point": {
"type": "point",
"coordinates": [5, 5]
}
}
Я также добавил второй документ за пределы вашей рамки, чтобы проверить его работоспособность:
POST /test_index/doc/2
{
"name": "Bird",
"gatheringEvent": [
{
"siteCoordinates": [
{
"point": {
"type": "point",
"coordinates": [6, 11]
}
}
]
}
],
"point": {
"type": "point",
"coordinates": [6, 11]
}
}
Теперь оба ваших запроса работают как положено:
POST /test_index/doc/_search
{
"query": {
"filtered": {
"query": {
"match": {
"name": "Bird"
}
},
"filter": {
"nested": {
"path": "gatheringEvent.siteCoordinates",
"filter": {
"geo_shape": {
"gatheringEvent.siteCoordinates.point": {
"shape": {
"type": "polygon",
"coordinates": [
[
[0, 0],
[10, 0],
[10, 10],
[0, 10],
[0, 0]
]
]
},
"relation": "within"
}
}
}
}
}
}
}
}
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1.6931472,
"hits": [
{
"_index": "test_index",
"_type": "doc",
"_id": "1",
"_score": 1.6931472,
"_source": {
"name": "Bird",
"gatheringEvent": [
{
"siteCoordinates": [
{
"point": {
"type": "point",
"coordinates": [
5,
5
]
}
}
]
}
],
"point": {
"type": "point",
"coordinates": [
5,
5
]
}
}
}
]
}
}
Если вы на самом деле хотели только один уровень вложенности, это еще проще. Я тоже могу добавить этот код, если хотите, просто спросите.
Вот код, который я использовал:
http://sense.qbox.io/gist/e61259626d5f8525ee41ce7b049af25089bfb8f6