首页 > 解决方案 > ElasticSearch 和 NEST 6.x:将复杂对象映射到字符串

问题描述

我正在尝试在 elasticsearch 中设置索引并遇到子对象的问题。

鉴于以下情况:

public class VersionNo
{
    public string Major { get; set; }
    public string Minor { get; set; }
    public string Build { get; set; }
    public string Revision { get; set; }

    public override string ToString()
    {
        return $"{Major}_{Minor}_{Build}_{Revision}";
    }
}

public class Workflow
{
    public string Id { get; set; }

    public string Name { get; set; }

    public VersionNo VersionNo { get; set; }
}

我将如何为 Workflow.VersionNo 构建一个流畅的映射,以便索引以“Major.Minor.Build.Revision”结束?在下面的示例中,我无法弄清楚如何设置“versionNo”以正确组合子字段...

.Mappings(ms => ms
                .Map<Workflow>(m => m
                    .Properties(props => props
                        .Text(t => t
                            .Name("name")
                        )
                        .Text(t => t
                            .Name("versionNo")
                        )
                        .Text(t => t
                            .Name("id")
                        )
                    )
                )
            )

标签: elasticsearchnestelasticsearch-6

解决方案


您需要告诉 NEST 如何序列化VersionNo,以便将该类型的实例序列化为字符串。最直接的方法是

  1. 添加 nuget 包NEST.JsonNetSerializer
  2. 连接JsonNetSerializerNEST.JsonNetSerializer 包,以便 Json.NET 成为 NEST 用于您的文档的序列化程序
  3. 为知道如何序列化为字符串JsonConverter以及如何将字符串值读入VersionNoVersionNoVersionNo

或者,您可以只定义一个字符串属性VersionNo将值连接起来,就像被覆盖的ToString()方法一样。除了 、 和 属性之外,该属性还可以在 ElasticsearchMajor中进行Minor映射。使用这种方法,您可以搜索任何属性,因为每个属性都会被索引。BuildRevision


推荐阅读