Elasticsearch 映射 - 嵌套对象上的多字段 属性

Elasticsearch Mapping - Multi field on nested object property

我有以下属性

[Nested] public List<TagModel> Tags { get; set; }

而在TagModel中有一个属性如下

[String] public string Tag { get; set; }

我想使用 Nest 将 Tag 属性 映射为多字段 属性。

我认为这行得通,

.String
    (s => s.Name
        (n => n.Tags.First()
            .Tag)
        .Fields
            (fi => fi.String
                (sub => sub.Name("partial")
                    .Analyzer("test"))
            .String
                (sub => sub.Name("middle")
                    .Analyzer("test2"))));

但是在它输出的映射中,Tags 仍然是:

"tags": {
    "type": "nested",
    "properties": {
        "tag": {
            "type": "string"
        },

然后在映射结束时:

"tags.tag": {
    "type": "string",
    "fields": {
        "partial": {
            "type": "string",
            "analyzer": "test",
        },
        "middle": {
            "type": "string",
            "analyzer": "test2",
        },

并抛出异常 400reason": "Field name [tags.tag] cannot contain '.'"

我猜它不喜欢名称中的 linq First() 调用(这很奇怪,因为嵌套项中的搜索确实接受这个....)

那么我怎样才能将 属性 映射到 class 中,而 属性 中使用的 属性 本身就是 nested 项....

目前正在使用 Nest 2.0.0 alpha-2

好的,在(大量)猜测和检查之后,可以按如下方式完成:

x.Nested<TagModel>
    (ne => ne.Name(n => n.Tags)
        .AutoMap()
        .Properties
            (p => p.String
                    (s => s.Name(n => n.Tag)
                    .Fields
                        (fi => fi.String
                            (sub => sub.Name("partial")
                    .Analyzer("test"))
                .String
                    (sub => sub.Name("middle")
                    .Analyzer("test2"))))));

当你在模型中有额外的属性时,AutoMap 似乎是必需的,即如果我在 TagModel 中喜欢 TagID 然后没有 AutoMap此处未特别提及的任何其他属性都不会被映射(即使它们具有属性等设置)。