如何在 C# NEST 中正确映射字典?

问题描述 投票:0回答:1

我有一个名为“GrossSalaryElements”的字段,它是字符串和小数的字典。

当使用 Nest.Object 和自动映射为弹性创建索引时,它会为每个键创建一个属性,显然我不希望这样。我在网上读到我应该使用嵌套数据属性,但这需要在创建索引时手动设置。但是我似乎仍然遇到同样的问题,这是我当前的代码,我做得正确吗?:

            ElasticClient.Indices.Create(indexNameWithTenantId,
                c => c.InitializeUsing(new IndexState { Settings = new IndexSettings() }).Map<MainTermsDataModel>(
                    m=>m.AutoMap()
                    .Properties(p=>p
                        .Nested<IDictionary<string, decimal>>(x=>x
                            .Name(x=>x.GrossSalaryElements)
                            .Properties(pp=>pp
                                .Number(nn=>nn
                                    .Name(x=>x.Values)
                                    .Type(NumberType.Double)
                                )
                                .Keyword(k=>k
                                    .Name(x=>x.Keys)
                                )
                            )
                            )
                        )
                    )
                );

.net elasticsearch nest
1个回答
0
投票

在这个问题上花了几周时间后,我找到了解决方案和一些提示。

  1. 不要使用嵌套数据类型
  2. 像这样单独映射每个字典字段:
                            foreach(var x in dictFields)
                            {
                                p = p.Object<IDictionary<string, decimal>>(Q => Q
                                .Name(char.ToLower(x[0]) + x.Substring(1))
                                .Properties(pp => pp
                                    .Number(nn => nn
                                        .Name("values")
                                        .Type(NumberType.Double)
                                    )
                                    .Keyword(k => k
                                        .Name("key")
                                    )
                                ).Dynamic(false)
                                );
                            }
  1. 另请注意,这会降低搜索和刷新索引的性能。如果你想要包含多个对象的大型模型,我建议不要使用elasticsearch
© www.soinside.com 2019 - 2024. All rights reserved.