将索引键设置为输出字段映射
Set Index Key to Output Field Mapping
在我的索引中,我有一个名为 id
的字段。在我的扩充管道中,我计算了一个名为 /document/documentId
的值,我试图将其映射到 id
字段。但是,此映射似乎不起作用,因为 id
似乎总是一些看起来像散列的长值。我的所有其他输出字段映射都按预期工作。
索引部分:
{
'name': 'id',
'type': 'Edm.String',
'facetable': false,
'filterable': true,
'key': true,
'retrievable': true,
'searchable': true,
'sortable': true,
'analyzer': null,
'indexAnalyzer': null,
'searchAnalyzer': null,
'synonymMaps': [],
'fields': []
}
索引器部分:
'outputFieldMappings': [
{
'sourceFieldName': '/document/documentId',
'targetFieldName': 'id'
}
]
预期值:4b160942-050f-42b3-bbbb-f4531eb4ad7c
实际值:aHR0cHM6Ly9zdGRvY3VtZW50c2Rldi5ibG9iLmNvcmUud2luZG93cy5uZXQvMDNiZTBmMzEtNGMyZC00NDRjLTkzOTQtODJkZDY2YTc4MjNmL29yaWdpbmFscy80YjE2MDk0Mi0wNTBmLTQyYjMtYmJiYi1mNDUzMWViNGFkN2MucGRm0
任何有关如何解决此问题的想法都将不胜感激!
您可以使用常规字段映射而不是输出字段映射。如果您在 Azure 门户中创建了索引器,则您的密钥(即“id”,因为密钥在上面“id”的索引定义中为真)可能是 base64 编码的(默认情况下选中该选项)。您需要对其进行 base64 解码以获得原始值,或者您可以存储原始值的第二个副本而不对其进行编码(密钥需要进行编码)。下面是你如何做后者 - 这可以取代你的输出字段映射:
"fieldMappings": [
{
"sourceFieldName": "documentId",
"targetFieldName": "documentId"
},
{
"sourceFieldName": "documentId",
"targetFieldName": "id",
"mappingFunction": {
"name": "base64Encode"
}
}
]
请注意,您还需要在索引中添加一个 documentId 字段,因为您也以其原始格式存储它。
{
'name': 'documentId',
'type': 'Edm.String',
'facetable': false,
'filterable': true,
'key': false,
'retrievable': true,
'searchable': true,
'sortable': true,
'analyzer': null,
'indexAnalyzer': null,
'searchAnalyzer': null,
'synonymMaps': [],
'fields': []
}
或者,您可以只对 id 值进行 base64 编码(存储时)和解码(检索时)。此键值采用 base64 编码,因此可以安全地用作 Azure 认知搜索文档键。查看 https://docs.microsoft.com/azure/search/search-indexer-field-mappings 了解更多信息。
TL;DR - 不能对键使用输出字段映射。只能使用源字段。
根据 Microsoft 的说法,无法使用输出字段映射设置文档密钥。显然,在删除文档的情况下存在问题,因此密钥必须直接存在于文档之外。
我最终在 fieldMappings 中使用了映射函数。
"fieldMappings": [
{
"sourceFieldName": "metadata_storage_name",
"targetFieldName": "filename"
},
{
"sourceFieldName": "metadata_storage_name",
"targetFieldName": "id",
"mappingFunction": {
"name": "extractTokenAtPosition",
"parameters": {
"delimiter": ".",
"position": 0
}
}
}
]
因为我的文件名类似于 4b160942-050f-42b3-bbbb-f4531eb4ad7c.pdf
那么这最终映射正确映射到我的 ID。
在我的索引中,我有一个名为 id
的字段。在我的扩充管道中,我计算了一个名为 /document/documentId
的值,我试图将其映射到 id
字段。但是,此映射似乎不起作用,因为 id
似乎总是一些看起来像散列的长值。我的所有其他输出字段映射都按预期工作。
索引部分:
{
'name': 'id',
'type': 'Edm.String',
'facetable': false,
'filterable': true,
'key': true,
'retrievable': true,
'searchable': true,
'sortable': true,
'analyzer': null,
'indexAnalyzer': null,
'searchAnalyzer': null,
'synonymMaps': [],
'fields': []
}
索引器部分:
'outputFieldMappings': [
{
'sourceFieldName': '/document/documentId',
'targetFieldName': 'id'
}
]
预期值:4b160942-050f-42b3-bbbb-f4531eb4ad7c
实际值:aHR0cHM6Ly9zdGRvY3VtZW50c2Rldi5ibG9iLmNvcmUud2luZG93cy5uZXQvMDNiZTBmMzEtNGMyZC00NDRjLTkzOTQtODJkZDY2YTc4MjNmL29yaWdpbmFscy80YjE2MDk0Mi0wNTBmLTQyYjMtYmJiYi1mNDUzMWViNGFkN2MucGRm0
任何有关如何解决此问题的想法都将不胜感激!
您可以使用常规字段映射而不是输出字段映射。如果您在 Azure 门户中创建了索引器,则您的密钥(即“id”,因为密钥在上面“id”的索引定义中为真)可能是 base64 编码的(默认情况下选中该选项)。您需要对其进行 base64 解码以获得原始值,或者您可以存储原始值的第二个副本而不对其进行编码(密钥需要进行编码)。下面是你如何做后者 - 这可以取代你的输出字段映射:
"fieldMappings": [
{
"sourceFieldName": "documentId",
"targetFieldName": "documentId"
},
{
"sourceFieldName": "documentId",
"targetFieldName": "id",
"mappingFunction": {
"name": "base64Encode"
}
}
]
请注意,您还需要在索引中添加一个 documentId 字段,因为您也以其原始格式存储它。
{
'name': 'documentId',
'type': 'Edm.String',
'facetable': false,
'filterable': true,
'key': false,
'retrievable': true,
'searchable': true,
'sortable': true,
'analyzer': null,
'indexAnalyzer': null,
'searchAnalyzer': null,
'synonymMaps': [],
'fields': []
}
或者,您可以只对 id 值进行 base64 编码(存储时)和解码(检索时)。此键值采用 base64 编码,因此可以安全地用作 Azure 认知搜索文档键。查看 https://docs.microsoft.com/azure/search/search-indexer-field-mappings 了解更多信息。
TL;DR - 不能对键使用输出字段映射。只能使用源字段。
根据 Microsoft 的说法,无法使用输出字段映射设置文档密钥。显然,在删除文档的情况下存在问题,因此密钥必须直接存在于文档之外。
我最终在 fieldMappings 中使用了映射函数。
"fieldMappings": [
{
"sourceFieldName": "metadata_storage_name",
"targetFieldName": "filename"
},
{
"sourceFieldName": "metadata_storage_name",
"targetFieldName": "id",
"mappingFunction": {
"name": "extractTokenAtPosition",
"parameters": {
"delimiter": ".",
"position": 0
}
}
}
]
因为我的文件名类似于 4b160942-050f-42b3-bbbb-f4531eb4ad7c.pdf
那么这最终映射正确映射到我的 ID。