我是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"
}
}
);
答案 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"
}
]