C# 使用FieldMapping()在Azure搜索索引器中使用DataType.Complex
我正在尝试将一个嵌套对象从MongoDB(CosmosDB)映射到Azure搜索索引器 首先,这里是我在MongoDB中存储的内容C# 使用FieldMapping()在Azure搜索索引器中使用DataType.Complex,c#,azure,azure-cosmosdb,azure-cognitive-search,azure-search-.net-sdk,C#,Azure,Azure Cosmosdb,Azure Cognitive Search,Azure Search .net Sdk,我正在尝试将一个嵌套对象从MongoDB(CosmosDB)映射到Azure搜索索引器 首先,这里是我在MongoDB中存储的内容 { "_id" : { "$binary" : "eHemgNj2FkWlqECKkGKnJA==", "$type" : "03" }, "UpdatedBy" : { "_id" : { "$binary" : "0wtu6BgDm0GrTbffr1EmhQ==",
{
"_id" : {
"$binary" : "eHemgNj2FkWlqECKkGKnJA==",
"$type" : "03"
},
"UpdatedBy" : {
"_id" : {
"$binary" : "0wtu6BgDm0GrTbffr1EmhQ==",
"$type" : "03"
},
"Email" : "canuserview@gmail.com"
},
"Status" : "New",
"Name" : "123",
"CustomerName" : ""
}
然后,我使用Microsoft.Azure.Search.Models nuget包编写了一个c#程序,以编程方式创建索引
private async Task StartIndexAsync(bool resetIndexer = true)
{
await CreateIndexAsync(new[]{
new Field(nameof(ProjectSearchModel.Id), DataType.String) { IsKey = true, IsSearchable = false, IsFilterable = false, IsSortable = false, IsFacetable = false, IsRetrievable = true},
new Field(nameof(ProjectSearchModel.Name), DataType.String) { IsKey = false, IsSearchable = true, IsFilterable = true, IsSortable = true, IsFacetable = false, IsRetrievable = true},
new Field(nameof(ProjectSearchModel.CustomerName), DataType.String) { IsKey = false, IsSearchable = true, IsFilterable = true, IsSortable = true, IsFacetable = false, IsRetrievable = true},
Field.NewComplex(nameof(ProjectSearchModel.UpdatedBy), false, new [] {
new Field(nameof(ProjectSearchModel.UpdatedBy.Id), DataType.String) { IsKey = false, IsSearchable = false, IsFilterable = false, IsSortable = false, IsFacetable = false, IsRetrievable = true},
new Field(nameof(ProjectSearchModel.UpdatedBy.Email), DataType.String) { IsKey = false, IsSearchable = true, IsFilterable = true, IsSortable = true, IsFacetable = false, IsRetrievable = true}
})
},
new[] {
nameof(ProjectSearchModel.Name),
nameof(ProjectSearchModel.Number),
nameof(ProjectSearchModel.CustomerName),
$"{nameof(ProjectSearchModel.UpdatedBy)}/{nameof(ProjectSearchModel.UpdatedBy.Email)}"
});
await CreateDatasourceAsync();
await StartIndexerAsync(resetIndexer);
}
然后,对于indexer,我定义了一些字段映射,因为我想将MongoDB中的_id映射到indexer中的id字段
public async Task CreateIndexerAsync(string indexerName, string datasourceName, string indexName)
{
_logger.LogInformation("{0}", "Creating Indexer and syncing data...\n");
var indexer =
new Indexer()
{
Name = indexerName,
Description = "Data indexer",
DataSourceName = datasourceName,
TargetIndexName = indexName,
FieldMappings = new List<FieldMapping> { new FieldMapping() { SourceFieldName = "doc_id", TargetFieldName = "Id" } }
};
try
{
await _searchClient.Indexers.CreateOrUpdateAsync(indexer);
}
catch (Exception ex)
{
_logger.LogError("Error creating and running indexer: {0}", ex.Message);
return;
}
await StartCreation(indexerName);
}
我想对UpdatedBy字段内的Id子字段执行相同的操作。因此,我想将MongoDB中的UpdatedBy.\u id映射到索引中的UpdatedBy/id
有没有办法做到这一点
提前向大家表示衷心的感谢 Azure搜索索引器不支持此操作。添加字段映射时,目标应该是顶级索引字段。这意味着,您可以将数据源中的一个复杂对象作为一个整体映射到索引中的一个复杂字段,但不能将源中复杂对象的一个子字段映射到索引中复杂字段的“子”字段 第2点在美国是这样的,但我会更清楚地更新它 作为一种解决方法,您可以尝试修改“UpdatedBy”属性,使子字段与索引定义对齐;或者,您可以尝试直接使用SDK修改子字段,使用类似于以下内容的内容(我假设您的索引数据模型有一个名称) 这将把MongoDb中缺少的Id属性“合并”(添加)到搜索索引中-请注意,这只起作用,因为“UpdatedBy”复杂字段不是集合
{
"@odata.context": "myprojectendpoint/indexes('myproject-index-dev')/$metadata#docs(*)",
"value": [
{
"@search.score": 1,
"Id": "30dbf04d-cbc7-4597-8d48-209f3a320cf8",
"Name": "friday soon",
"CustomerName": "Kyle Ahn",
"UpdatedBy": {
"Id": null,
"Email": "kyle.ahn@onthestep.ca"
}
}
]
}
IndexAction.MergeOrUpload(
new Customer()
{
Id = "....",
UpdatedBy = new
{
Id = "..."
}
}
)