【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)
)
)
)
)
)
);