Геопространственный поиск Azure Cosmos DB потребляет слишком много RU - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть одна коллекция Azure Cosmos DB, к которой я обращаюсь, надеясь использовать геопространственный индекс для эффективных запросов.Проблема, с которой я сталкиваюсь, заключается в том, что потребление RU кажется неэффективным.

В коллекции содержится всего 50 КБ документов по 1 КБ, но запрос с использованием ST_DISTANCE, возвращающий один документ, потребляет> 900 RU.

Я видел, как RU масштабируется линейно на основе количества документовв коллекции.Казалось бы, индексирование должно предотвращать это поведение.

Пример запроса (950 RU):

SELECT * FROM c where ST_DISTANCE(c.location, { 'type': 'Point', 'coordinates': [34.69, -1.91] }) < 500

Пример документа:

[
    {
        "id": "1504891036",
        "name": "Oujda",
        "location": {
            "type": "Point",
            "coordinates": [
                34.69,
                -1.91
            ]
        },
        "population": 409391,
        "country": "Morocco",
        "country.iso2": "MA",
        "country.iso3": "MAR",
    }
]

Я не изменил значение по умолчаниюполитика индексирования, которая, кажется, охватывает пространственную индексацию:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Spatial",
                    "dataType": "Point"
                }
            ]
        }
    ],
    "excludedPaths": []
}

1 Ответ

0 голосов
/ 06 декабря 2018

Я определил проблему.Я переместил долготу и координату широты, предписанные GeoJSON:

Космос ожидает:

"location": {
            "type": "Point",
            "coordinates": [
                <@lon>,
                <@lat>
            ]

Я неправильно предположил, что это широта / долгота.Поэтому многие из моих широт были вне требуемого диапазона 90 / -90, так как долгота может быть 180 / -180.После воссоздания моих документов ~ 50k, RU для поиска на основе координат постоянно <10 RU. </p>

До исправления (все документы имеют транспонированные координаты широты / долготы, многие из которых выходят за пределы 90 / -90 и поэтому недействительны):

SELECT * FROM c where ST_DISTANCE(c.location, { 'type': 'Point', 'coordinates': [34.69, -1.91] }) < 500
940 RUs, 1 document returned

После исправления (все документы воссозданы с правильной настройкой lat / lon согласно спецификациям GeoJSON):

SELECT * FROM c where ST_DISTANCE(c.location, { 'type': 'Point', 'coordinates': [-1.91,34.69] }) < 500
6 RUs, 1 document returned

Первоначальная проблема была подтверждена / диагностирована следующим запросом:

SELECT ST_ISVALIDDETAILED(c.location) FROM c where c.name = "Kansas City"
Error: "Latitude values must be between -90 and 90 degrees."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...