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

Другие вопросы по тегам