【ElasticSearch Nest】 映射(mapping)

NEST映射方式

自动映射(从POCO属性类型推断)

在创建索引或通过Put Mapping API创建映射时,NEST提供了一个称为自动映射的功能,可以从您正在映射的CLR POCO属性类型自动推断出正确的Elasticsearch字段数据类型。

//自动映射(AutoMap())
{
    var settings = new ConnectionSettings(new Uri("http://****:9200")).DefaultIndex("index5");
    ElasticClient client = new ElasticClient(settings);
    client.Indices.Create("index5", i => i.Map<People3>(m => m.AutoMap()));
    client.IndexDocument<People3>(new People3 { Id = 4, Names = new List<Name> { new Name { Firstname = "wj", Lastname = "f" }, new Name { Firstname = "wj2", Lastname = "f2" } } });
}
public class People3
{
    public int Id { get; set; }
    public List<Name> Names { get; set; }
}

.NET类型推断:

String映射到"text"与"keyword"子字段。请参阅[Multi Fields]
Int32映射到"integer"
UInt16映射到"integer"
Int16映射到"short"
Byte映射到"short"
Int64映射到"long"
UInt32映射到"long"
TimeSpan映射到"long"
Single映射到"float"
Double映射到"double"
Decimal映射到"double"
UInt64映射到"double"
DateTime映射到"date"
DateTimeOffset映射到"date"
Boolean映射到"boolean"
Char映射到"keyword"
Guid映射到"keyword"

并支持NEST中定义的一些特殊类型

Nest.GeoLocation映射到"geo_point"
Nest.CompletionField映射到"completion"
Nest.Attachment映射到"attachment"
Nest.DateRange映射到"date_range"
Nest.DoubleRange映射到"double_range"
Nest.FloatRange映射到"float_range"
Nest.IntegerRange映射到"integer_range"
Nest.LongRange映射到"long_range"

所有其他类型默认映射到"object"。

Attribute映射

在自动映射中,您看到可以使用.AutoMap()从POCO的属性推断出POCO的类型映射。属性映射可以利用属性上的特性来定义您的映射。
当您使用属性映射时,还必须调用.AutoMap()

//Attribute映射
{
    var settings = new ConnectionSettings(new Uri("http://****:9200")).DefaultIndex("index7");
    ElasticClient client = new ElasticClient(settings);
    client.Indices.Create("index7", i => i.Map<People4>(m => m.AutoMap()));
}

public class People4
{
    public int Id { get; set; }
    [Text(Name = "first_name", Norms = false)]
    public string FirstName { get; set; }

    [Date(Format = "MMddyyyy")]
    public DateTime Birthday { get; set; }
    [Boolean(NullValue = false, Store = true)]
    public bool IsManager { get; set; }
    [Nested]
    [PropertyName("names")]
    public List<Name> Names { get; set; }
    [Object]
    [PropertyName("names2")]
    public List<Name> Names2 { get; set; }
}

属性映射可以是一种方便的方法来控制如何使用最小的代码映射POCO,但是还有一些映射功能不能用属性表示,例如,多字段。 为了在NEST中拥有完整的映射功能,请查看Fluent Mapping。

Fluent映射

Fluent映射POCO属性到Elasticsearch类型映射中的字段提供了对该过程的最大控制。 通过Fluent映射,POCO的每个属性都被显式映射到一个Elasticsearch类型的字段映射。


    //Fluent mapping映射
    {
        var settings = new ConnectionSettings(new Uri("http://****:9200")).DefaultIndex("index7");
        ElasticClient client = new ElasticClient(settings);
        client.Indices.Create("index8", i => i.Map<People5>(m =>
                m.Properties(ps =>
                            ps.Text(p => p.Name(n => n.FirstName).Fields(f => f.Keyword(k => k.Name(n => n.FirstName))))
                              .Date(p => p.Name(n => n.Birthday))
                              .Number(p => p.Name(n => n.Id).Type(NumberType.Long))
                              .Boolean(p => p.Name(n => n.IsManager))
                              .Nested<Name>(p => p.Name(n => n.Names))
                              .Object<Name>(p => p.Name(n => n.Names2))
                            )
            )
        );
    }

public class People5
{
    public int Id { get; set; }
    public int Age { get; set; }
    public string FirstName { get; set; }
    public DateTime Birthday { get; set; }
    public bool IsManager { get; set; }
    public List<Name> Names { get; set; }
    public List<Name> Names2 { get; set; }
}

通过访客模式

多字段

可以使用字段映射中的.Fields()方法在映射上创建多个字段

var descriptor = new CreateIndexDescriptor("myindex")
    .Mappings(ms => ms
        .Map<Person>(m => m
            .Properties(p => p
                .Text(t => t
                    .Name(n => n.Name)
                    .Fields(ff => ff
                        .Text(tt => tt
                            .Name("stop") 
                            .Analyzer("stop")
                        )
                        .Text(tt => tt
                            .Name("shingles")
                            .Analyzer("name_shingles") 
                        )
                        .Keyword(k => k
                            .Name("keyword") 
                            .IgnoreAbove(256)
                        )
                    )
                )
            )
        )
    );

参考:
https://blog.csdn.net/WuLex/article/details/71375032

posted @ 2022-07-27 21:03  .Neterr  阅读(395)  评论(0编辑  收藏  举报