自定义WebApi技能不会填充索引

时间:2019-07-19 22:38:56

标签: azure azure-functions azure-storage-blobs azure-search

我是Azure搜索的新手,目前正在设置一种环境,以根据某些详细信息为图像编制索引。 我建立了一个索引,其中除其他字段外,还包含一个我称为details的复杂字段的集合。

要填充details字段,我在索引器上设置了一个Azure函数作为WebApiSkill,该函数将输入uri作为输入并返回details

According to the example from the documentation,该函数接收到一个application/json POST请求,如下所示:

{
    "values": [
        {
            "recordId": "1",
            "data": {
                "uri": "..."
            }
        },
        ...
    ]
}

..并立即返回一个OkObjectResult和相应的json响应:

{
    "values": [
        {
            "recordId": "1",
            "data": {
                "details": [
                    {
                        "detailName": "...",
                        "detailRatio": "..."
                    }, {
                        "detailName": "...",
                        "detailRatio": "..."
                    }
                ]
            }
        },
        ...
    ]
}

我的问题是,即使我遵循有关如何为索引器技能组设置自定义技能的文档,并且尽管以上所有内容似乎结构正确,索引图像上的details仍然没有填充,并且它只是显示为一个空列表。 这是对我的索引进行空搜索的结果:

{
    "@odata.context": "https://{search}.search.windows.net/indexes('{index}')/$metadata#docs(*)",
    "value": [
        {
            "@search.score": 1,
            "id": "aHR0CHM6Ly9yZWxhdGl...",
            "uri": "{link}",
            "details": []
        }
}

通过控制台日志执行Azure Function之后,有可能看到索引器确实在执行它并接收结果,因此我认为这不是连接问题或函数代码的问题。

我想知道这是否常见吗?如果不是这样,我应该采取什么步骤尝试找出为什么索引器拒绝正确填充索引?


这是我的索引/索引器/技能集的一些代码片段。 对于任何混淆,我深表歉意,因为其中一些必须通过代码(C#)进行,而另一些则必须通过Azure门户或POST请求进行。据我所知,所有这些都归结为相同,但是我目前正在将所有这些都转换为POST请求。

索引:

{
    "id": "...",
    "uri": "...",
    "details": [
        {
            "detailName": "...",
            "detailRatio": "..."
        }, {
            "detailName": "...",
            "detailRatio": "..."
        }
    ]
}

技能集:

{
  "name": "...",
  "description": "...",
  "skills":
  [
    {
      "@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
      "uri": "https://{azure-function}.azurewebsites.net/api/{function}?code={code}",
      "context": "/document",
      "inputs": [
        {
          "name": "uri",
          "source": "/document/uri"
        }
      ],
      "outputs": [
        {
          "name": "details",
          "targetName": "details"
        }
      ]
    }
  ]
}

索引器:

new Indexer(
                name: indexerName,
                dataSourceName: dataSourceName,
                targetIndexName: indexName,
                skillsetName: skillsetName,
                fieldMappings: new List<FieldMapping>
                {
                    new FieldMapping
                    {
                        SourceFieldName = "metadata_storage_path",
                        TargetFieldName = "uri"
                    }
                },
                schedule: new IndexingSchedule {
                    Interval = new TimeSpan(0, 10, 0)
                },
                parameters: new IndexingParameters
                {
                    Configuration = new Dictionary<string, object>
                    {
                        ["imageAction"] = "generateNormalizedImages"
                    }
                }
            );

1 个答案:

答案 0 :(得分:2)

您的索引器定义缺失outputFieldMappings,以指定details的数据应来自何处。参见https://docs.microsoft.com/en-us/rest/api/searchservice/create-indexer#outputfieldmappings

您的技能context"/document",而targetName"details",因此结果将是"/document/details"

"outputFieldMappings": [
  {
    "sourceFieldName": "/document/details",
    "targetFieldName": "details"
  }
]