【问题标题】:Azure search indexer : cannot create an indexer based on mongodb data source with a collection containing a field named '$ref'Azure 搜索索引器:无法基于包含名为“$ref”的字段的集合的 mongodb 数据源创建索引器
【发布时间】:2023-02-13 02:40:16
【问题描述】:

如标题中所述,我在创建索引器时遇到了一个奇怪的错误(同时使用门户 azure 和 Rest api)。

{
    "error": {
        "code": "",
        "message": "Error with data source: Additional content found in JSON reference object. A JSON reference object should only have a $ref property. Path '$id'.  Please adjust your data source definition in order to proceed."
    }
}

数据源是通过 Azure 门户创建的,未指定删除或更改策略。

cosmos db (MongoDb) 中的 JSON 结构邮寄收藏

{
  "_id": {
    "$oid": "....."
  },
  "author": {
    "$ref": "user",
    "$id": {
      "$oid": "...."
    }
  },
  "_class": "com.community.domain.Post"
}

在索引器定义下面

{
"dataSourceName": "fshco-post",
"targetIndexName": "index",
"fieldMappings": [
{
"sourceFieldName": "_class",
"targetFieldName": "class"
}

    ],
    "parameters": {
        "batchSize": 1000,
        "maxFailedItems": null,
        "maxFailedItemsPerBatch": null
    }

}

确认问题出在 $ref 属性上。我使用了一个包含一个文档但在作者字段中没有子属性 $ref 的集合 Post,它被成功索引。

我尝试了技能集 **ShaperSkill ** 来修改 $ref 命名,但也没有遇到同样的错误。 之后,我了解到问题可能出在技能集执行阶段之前的破解数据阶段。 indexing phases

下面是我使用的定义技能集:

 {
      "@odata.type": "#Microsoft.Skills.Util.ShaperSkill",
      "name": "#1",
      "description": null,
      "context": "/document",
      "inputs": [
        {
          "name": "refto",
          "source": "/document/author/$ref"
        },
        {
          "name": "id",
          "source": "/document/author/$id"
        }
      ],
      "outputs": [
        {
          "name": "output",
          "targetName": "post_author"  --> same name as the index attribute
        }
      ]
    }
  ]

在索引器中

    "skillsetName": "skillpostshaper",
    "outputFieldMappings": [
        {
            "sourceFieldName": "/document/post_author",
            "targetFieldName": "post_author"
        }
    ],

有什么明显的我错过了吗?

【问题讨论】:

    标签: azure azure-cognitive-search


    【解决方案1】:

    AFAIK,索引字段名称不应以特殊字符开头,如here所述 在索引器中使用字段映射,我已经完成了一个字段到另一个字段的操作,下面是我遵循的步骤,

    1. 已创建数据源、索引和索引器。
    2. 在索引中添加了名称为 ref 的新字段。
    3. 在索引器中,添加了字段映射,如下所示。这里将 ref 字段映射到名称为 HotelName 的现有字段。
    4. 运行索引器后,能够在 ref 字段中获取数据。

    【讨论】:

    • 正如我在描述中提到的,问题出在映射字段定义步骤之前的破解数据步骤中。因此,即使我在索引器中添加一个映射字段,索引器创建也会失败。
    • 你能用特殊字符在索引中创建字段吗?
    • 不,我不能。但我仍然不明白为什么你关注索引定义,因为错误已经远远落后了。
    • 因为问题出在索引字段上。请检查官方文档中提到的,索引中不能有以特殊字符开头的字段。我不确定不创建索引如何创建索引器?
    • 我尝试在索引器中做一个字段映射,就像这样问题出在数据源定义中,这是我们在创建时无法处理的,不像索引。
    【解决方案2】:

    您面临的错误与您在 JSON 文件中对 $ref 的使用有关,与索引器本身无关。 JSON文件中的$ref关键字是一个“保留字”,只能用来指向引用。作为 cmets 的一部分,在索引数据源之前修改数据源中的字段名称,通过删除 $ref 属性或将其重命名为不同的字段名称,应该让索引器以您期望的方式读取 JSON 文件。

    这是对JSON documentation的参考以获取更多信息。

    【讨论】:

    • $ref 属性由 cosmos (mongodb api) 自动生成,因为在我们的数据库模式中,我们使用 DBref 来引用集合之间的多对一关系。DBRef 对象由 {$ref:'collectionName',$ id:'ObjectId('id')'}。所以也许天蓝色的搜索文档应该提到不应该使用 DBref 对象来防止这样的问题。
    • 这应该在接下来的 2 个工作日内更新,并且在接下来的 2-3 个月内,对于预览中的连接器,这应该被允许作为常规词的一部分(未保留)。
    【解决方案3】:

    这是微软团队对这个问题的回答:

    ... 似乎 mongo db 使用 $ref、$id 和 $db 来创建对其他集合中其他文档的引用。 Newtonsoft 使用 $ref 和 $id 作为自引用 json。我们抛出错误是因为 newtonsoft 试图将 $ref 对象反序列化为不存在的对象(可能是因为它位于单独的 mongo 数据库集合中的单独文档中)。

    我们的索引器未配置为遵循 mongo 中的文档引用,因此我们能做的最好的事情就是允许将这些系统字段作为纯文本进行索引(通过 MetadataPropertyHandling.Ignore)。至少,我可以更新反序列化器,使其不尝试反序列化 Mongo 集合的自引用 json,因为这样的文档可能会与系统 mongo 字段发生冲突。这需要代码修复,可能需要几个月才能向客户推出。

    我认为这不符合我们的修补程序标准,因为它不会影响任何生产服务。但我们会将其添加到我们的待办事项列表中。
    在短期内,如果可能的话,除了从数据源中删除该列外,恐怕没有其他解决方法。不幸的是,mongo 数据库索引器目前不支持自定义查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-17
      • 2021-09-15
      • 2020-07-20
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-11-23
      相关资源
      最近更新 更多