将索引键设置为输出字段映射

问题描述

在索引中,我有一个名为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”的索引定义中密钥为true)可能是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': []

}

或者,您可以只进行base64编码(在存储时)和解码(在检索时)id值。此密钥值是base64编码的,因此可以安全用作Azure Cognitive Search文档密钥。查看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","mappingFunction": {
        "name": "extractTokenAtPosition","parameters": {
          "delimiter": ".","position": 0
        }
      }
    }
  ]

由于我的文件名类似于4b160942-050f-42b3-bbbb-f4531eb4ad7c.pdf,所以最终将映射正确映射到我的ID。