如何在 Azure 搜索服务中添加 Azure Cosmos DB 的主键作为搜索参数

How to add Primary key of Azure Cosmos DB as search parameter in Azure search Service

我正在使用 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 字段 encrypted/encoded 到其他一些字符串如下:

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

如何检索我的原始 ID 并将其设置为搜索参数?

提前致谢!!

UkVRX1ZFSF9DVVNUX0 是一个 base64 编码的字符串,当你解码它时你会得到 REQ_VEH_CUST_.

为什么这些值正在转换为 base64 编码的字符串?

请检查索引器详细信息。由于 key 字段中的值存在限制(https://docs.microsoft.com/en-us/rest/api/searchservice/naming-rules - 请参阅 Document Key),索引器中可能有一个设置(查看字段映射部分,然后检查是否 base64Encode 映射函数应用于 id 字段映射),它将值转换并存储为 base64 编码字符串。

如果你确信source中id的值(即索引中的key字段)不会违反key字段值的规则,你可以去掉这个base64encode映射函数,保存索引器,重置索引器并再次运行。这次数据将按原样保存在源中。

基于@GauravMantri 评论的评论,因为你的 ID 在存储之前是 base 64 编码的,所以如果该数据本身是唯一键而没有按照建议进行编码,你可以在存储 Id 时删除编码。

或者,您可以对已有的值进行编码,例如 System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("IdBeforeEncodingAsString")) 并用作搜索参数,它应该可以工作,因为此字符串的 base64 编码值存储为 Id。