Как добавить первичный ключ Azure Cosmos DB в качестве параметра поиска в службе поиска Azure

Я использую службу поиска Azure для поиска документов в моей учетной записи Azure CosmosDB.

Используя портал, я создал службу поиска Azure и предоставил существующую базу данных CosmosDB в качестве источника данных.

Ниже приведен образец документа, хранящийся в CosmosDB.

{
    "id": "Engine",     
    "Sub-Components Price": [
        //Price list
    ],
    "Sub-Components": [
        "List of sub components here"
    ],      
    "Brand": "Brand Name here",     
}

Когда CosmosDB, содержащий вышеуказанный документ, предоставляется в качестве источника данных для поиска Azure, поле id внутренне преобразуется в некоторую строку (может быть автоматическое индексирование).

Я могу установить другие поля, такие как «Подкомпоненты», «Торговая марка», в качестве параметра поиска (с помощью C #) и выполнять поиск только в этих конкретных полях. Я хочу применить то же самое к полю id. Но поле id зашифровано / закодировано в некоторую другую строку следующим образом:

{
    "id": "UkVRX1ZFSF9DVVNUX0",     
    "Sub-Components Price": [
        //Price list
    ],
    "Sub-Components": [
        "List of sub components here"
    ],      
    "Brand": "Brand Name here",     
}

Как получить мой исходный идентификатор и установить его в качестве параметра поиска?

Заранее спасибо !!


person code-geek    schedule 07.02.2019    source источник
comment
UkVRX1ZFSF9DVVNUX0 когда я его декодирую base64, я получаю REQ_VEH_CUST_. Имеет ли смысл это декодированное значение в контексте вашего приложения?   -  person Gaurav Mantri    schedule 07.02.2019
comment
@GauravMantri Большое спасибо. Да, это имеет смысл. Это то, что мне было нужно. Можете ли вы поделиться расшифрованным фрагментом?   -  person code-geek    schedule 07.02.2019
comment
Я использовал base64decode.org для декодирования UkVRX1ZFSF9DVVNUX0.   -  person Gaurav Mantri    schedule 07.02.2019
comment
Спасибо за вашу помощь!   -  person code-geek    schedule 07.02.2019
comment
Но я хотел бы добавить это в качестве параметра поиска в лазурный поиск. Будет ли эта декодированная строка использоваться в качестве параметра поиска и давать правильные результаты?   -  person code-geek    schedule 07.02.2019
comment
Значение конечного кода, которое у вас есть, например System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("REQ_VEH_CUST_")), и используйте в качестве параметра поиска, оно должно работать, так как кодировка base64 сохраняется.   -  person Pranav Singh    schedule 07.02.2019
comment
But I would like to add this as search parameter to azure search. Will this decoded string be taken as search paramtere and gives proper results? - Нет, не будет. Вам нужно будет закодировать строку поиска base64, а затем отправить ее в Поиск Azure.   -  person Gaurav Mantri    schedule 07.02.2019


Ответы (2)


UkVRX1ZFSF9DVVNUX0 - это строка в кодировке base64, и когда вы ее декодируете, вы получаете REQ_VEH_CUST_.

Почему значения преобразуются в строку в кодировке base64?

Пожалуйста, проверьте данные индексатора. Поскольку существуют ограничения на значение в поле key (https://docs.microsoft.com/en-us/rest/api/searchservice/naming-rules - см. Document Key), вероятно, в индексаторе есть настройка (см. раздел сопоставления полей, а затем проверьте, base64Encode функция сопоставления применяется к отображению поля id), который преобразует и сохраняет значение как строку в кодировке base64.

Если вы уверены, что значение id в источнике (т.е. поле key в индексе) не нарушит правило для значения ключевого поля, вы можете удалить эту функцию сопоставления base64encode, сохранить индексатор, сбросить индексатор и запустить его снова. На этот раз данные будут сохранены в исходном виде.

person Gaurav Mantri    schedule 07.02.2019

На основе комментария комментария @GauravMantri, поскольку ваш идентификатор закодирован в базе 64 перед сохранением, поэтому вы можете удалить кодировку при сохранении идентификатора, если эти данные являются уникальным ключом сами по себе без кодирования, как предлагается.

В качестве альтернативы вы можете использовать значение endcode, которое у вас уже есть, например System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("IdBeforeEncodingAsString")), и использовать в качестве параметра поиска, оно должно работать, поскольку значение этой строки в кодировке base64 хранится как Id.

person Pranav Singh    schedule 07.02.2019