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

时间:2019-02-07 08:27:24

标签: c# azure azure-cosmosdb azure-search azure-search-.net-sdk

我正在使用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",     
}

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

谢谢!

2 个答案:

答案 0 :(得分:3)

UkVRX1ZFSF9DVVNUX0是base64编码的字符串,解码时会得到REQ_VEH_CUST_

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

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

如果您确信源文件中id的值(即索引中的id)不会违反键字段值的规则,则可以删除此base64encode映射函数,保存索引器,重置索引器,然后再次运行。这次,数据将按原样保存在源中。

答案 1 :(得分:1)

基于@GauravMantri注释的注释,因为您的id在存储之前是基于64编码的,因此,如果该数据本身是唯一键而不建议编码,则可以在存储ID时删除编码。

或者,您可以像System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("IdBeforeEncodingAsString"))那样结束已经具有的值并用作搜索参数,因为该字符串的base64编码值存储为ID,所以它应该可以工作。