Я меняю индексацию Cosmos DB, но она не работает должным образом

Я использую Azure SQL API, и мои данные структурированы следующим образом:

{
"deviceId": "123_123",
"comms": 0,
"engineSpdEnc": 0,
"currentTime": 1542185998605,
"deviceName": "mydevice2",
"siteId": 0,
"messageType": 2,
"data": {

    "v5B3Freq": 0,
    "v5B3Amp": 0,
    "v5B4Freq": 0,
    "v5B4Amp": 0,
    "v5B5Freq": 0,
    "v5B5Amp": 0,
    "v6B6Freq": 0,
    "v6B6Amp": 0,
    "v6B7Freq": 0,
    "v6B7Amp": 0,
    "inletPres": 0
},
"EventProcessedUtcTime": "2018-11-14T09:01:42.6897624Z",
"PartitionId": 1,
"EventEnqueuedUtcTime": "2018-11-14T08:59:58.645Z",
"IoTHub": {
    "MessageId": null,
    "CorrelationId": null,
    "ConnectionDeviceId": "device1",
    "ConnectionDeviceGenerationId": "636758197942626855",
    "EnqueuedTime": "2018-11-14T08:59:58.649Z",
    "StreamId": null
},
"id": "1734dd0c-1bb5-d424-4946-e2c957bb3858",
"_rid": "lblPAOEu3xYCAAAAAAAAAA==",
"_self": "dbs/lblPAA==/colls/lblPAOEu3xY=/docs/lblPAOEu3xYCAAAAAAAAAA==/",
"_etag": "\"08008e15-0000-0000-0000-5bebe47c0000\"",
"_attachments": "attachments/",
"_ts": 1542186108    }

И, используя портал Azure, я изменил политику индексирования со значения по умолчанию на следующую:

{
"indexingMode": "lazy",
"automatic": false,
"includedPaths": [
    {
        "path": "/*",
        "indexes": [
            {
                "kind": "Range",
                "dataType": "Number",
                "precision": 3
            },
            {
                "kind": "Range",
                "dataType": "String",
                "precision": 3
            },
            {
                "kind": "Spatial",
                "dataType": "Point"
            }
        ]
    }
],
"excludedPaths": [
    {
        "path": "/data/*"
    }
]
}

В соответствии с этим я отключил политику автоматической индексации и исключил путь в /data/*, что означает, что если я собираюсь запросить:

select * from c where c.data.v6B7Amp = 0

Мне он ничего не должен возвращать, поскольку дляc.data.pressure нет индексации, но я получаю все записи, которые должны быть в нем.

Это потому, что я использую портал Azure для изменения индексации или чего-то еще?


person Amjath Khan    schedule 18.11.2018    source источник
comment
Индексирование! == Фильтрация :).   -  person Gaurav Mantri    schedule 18.11.2018
comment
Вы дали время на завершение процесса индексации? Всякий раз, когда вы меняете политику индексирования, все должно быть переиндексировано и включено / исключено с нуля, и в зависимости от размера вашей базы данных это может занять время.   -  person Nick Chapsas    schedule 18.11.2018
comment
Я знаю, что это не фильтрация, но cosmos DB - это индексированная база данных на основе дерева. В результате, когда мы сохраняем c.data.pressure, он не может найти в условии where. Я хочу иметь полное ручное индексирование, при котором индексируется только верхний уровень, чтобы пропускная способность записи была больше.   -  person Amjath Khan    schedule 18.11.2018
comment
Моя коллекция пуста. изменил политику, загрузил файл json и проверил его. @ NickChapsas   -  person Amjath Khan    schedule 18.11.2018
comment
@NickChapsas, я правильно ожидал .... поведение не дает результатов для where фильтрация c.data.pressure ‹25 ..   -  person Amjath Khan    schedule 18.11.2018
comment
Да, но позволь мне кое-что прояснить. Можете ли вы опубликовать свою актуальную политику индексирования? Это неправильно вставлено, поэтому я не могу попытаться воссоздать его локально.   -  person Nick Chapsas    schedule 18.11.2018
comment
@NickChapsas, я обновил свой исходный JSON и политику индексирования   -  person Amjath Khan    schedule 18.11.2018
comment
@NickChapsas вы опробовали на месте?   -  person Amjath Khan    schedule 18.11.2018


Ответы (3)


Во-первых, вам не нужно отключать automatic индексирование или устанавливать indexingMode на lazy, если у вас нет на то причины.

Похоже, что проверки на равенство могут работать, даже если путь исключен. Исключенный путь сработает, когда вы попытаетесь сделать что-то вроде order by против этого поля.

Вот пример использования ваших данных и вашей политики индексации:

введите описание изображения здесь

person Nick Chapsas    schedule 19.11.2018
comment
Причина, по которой я хочу отключить все индексы, заключается в том, что моя пропускная способность вставки увеличивается из-за задания аналитики Azure Stream. Поскольку мое пограничное устройство отправляет 20 сообщений одновременно, оно показывает регулируемую службу Cosmos DB. Я чувствую слишком большую индексацию, так как у меня в ней 150 датчиков. Мне просто интересно, что cosmos DB не может даже писать 20 сообщений на каждое соединение для каждой записи размером 8 КБ ... это тоже только из службы Azure Stream Analytics JOB. - person Amjath Khan; 19.11.2018
comment
@AmjathKhan Если автоматическое индексирование отключено, вы все равно можете выборочно добавлять определенные элементы в индекс, но неясно, делаете ли вы это, поэтому я поднял его. - person Nick Chapsas; 19.11.2018
comment
На моем пограничном устройстве я собираю данные 20 устройств, но эти данные каждое сообщение я не могу разделить по идентификатору устройства, поскольку (только отправка данных в концентратор событий может быть ключом разделения), добавленным на стороне отправителя. Из задания Stream Analytics я отправляю данные в COSMOS DB. Как повысить производительность Cosmos DB - person Amjath Khan; 19.11.2018
comment
@AmjathKhan Я не могу ответить на это в комментариях к ответу. вам придется задать новый вопрос, связанный с этой новой проблемой. Я ответил только на вопрос об индексировании здесь. Не стесняйтесь открыть новый, подробно объяснив вашу проблему, и мы свяжемся с вами - person Nick Chapsas; 19.11.2018
comment
Можете ли вы помочь мне с образцом, как я могу добавить выборочный элемент в индекс с отключенным автоматическим индексом .. @Nick - person Amjath Khan; 19.11.2018
comment
@AmjathKhan Конечно, вы можете найти пример в документации здесь: docs.microsoft.com/ga-ie/azure/cosmos-db/ - person Nick Chapsas; 19.11.2018
comment
Когда мы удаляем автоматическое индексирование, предложение Order By не будет работать ни с одним элементом, который я пытался использовать ниже, имея индексирование выше .. но не отображаются записи SELECT * FROM c ORDER BY c._ts DESC - person Amjath Khan; 19.11.2018
comment
@AmjathKhan Это не сработает, если вы не проиндексируете элемент. Мета-свойство _ts - это совсем другая история. Его не следует использовать для оформления заказа. - person Nick Chapsas; 19.11.2018
comment
но в пути включения у меня есть give / * и exclude path / data / * .. это означает, что все остальное включено правильно ... - person Amjath Khan; 19.11.2018
comment
Да, но не автоматически, потому что вы выключили это. - person Nick Chapsas; 19.11.2018
comment
@AmjathKhan - Пожалуйста, воздержитесь от продолжительных разговоров в комментариях, так как комментарии предназначены не для этого. Если у вас есть дополнительные вопросы, опубликуйте их как таковые, как уже предложил Ник. - person David Makogon; 19.11.2018
comment
@DavidMakogon Извини. Я сделаю это . Спасибо, Ник. - person Amjath Khan; 19.11.2018

Когда путь исключен из индексации, запрос откатится, чтобы выполнить полное сканирование всех документов в коллекции для фильтрации результатов. Вот почему вы видите результаты по вашему запросу.

person Bala Peru    schedule 19.11.2018

Он должен быть "path": "/data/?". Знак вопроса относится к конкретному значению пути, тогда как звездочка представляет один или несколько путей, определенных подстановочным знаком.

person Christian Meyer    schedule 20.06.2019