这是你怎么做
private static void Main(){ var defaultIndex = "my_index"; var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); var settings = new ConnectionSettings(pool) .DefaultIndex(defaultIndex); var client = new ElasticClient(settings); if (client.IndexExists(defaultIndex).Exists) client.DeleteIndex(defaultIndex); var createIndexResponse = client.CreateIndex(defaultIndex, c => c .Settings(s => s .NumberOfShards(1) .NumberOfReplicas(0) ) .Mappings(m => m .Map<Person>(mm => mm .AutoMap() .Properties(p => p .Object<Address>(o => o .Name(n => n.Address) .AutoMap() .Properties(pp => pp .Text(t => t .Name(nn => nn.Street) .CopyTo(co => co .Field(Infer.Field<Person>(ff => ff.Search)) ) ) ) ) ) ) ) ); var indexResponse = client.Index(new Person { LastName = "foo", Address = new Address { Street = "bar" } } , i => i .Refresh(Refresh.WaitFor) ); var searchResponse = client.Search<Person>(s => s .Query(q => q .Match(m => m .Field(f => f.Search) .Query("bar") ) ) );}public class Person{ public string Search { get; set; } public string LastName { get; set; } public Address Address { get; set; }}public class Address{ public string Street { get; set; }}本质上
- 自动映射
Person
属性 - 显式将
Address
属性映射到Person
- 自动映射
Address
属性 - 明确映射该
Street
属性并进行设置CopyTo(...)
。此时,泛型类型参数是Address
类型,因此您需要使用Nest.Infer.Field<T>
来访问的Search
属性Person
,或使用字符串。
搜索返回期望的文档
{ "took" : 2, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.2876821, "hits" : [ { "_index" : "my_index", "_type" : "person", "_id" : "5tQDEWgBrKRHlz9qAve8", "_score" : 0.2876821, "_source" : { "lastName" : "foo", "address" : { "street" : "bar" } } } ] }}copy_toElasticsearch中的字段不一定需要在C#POCO上作为属性公开,因为
_source不会包含它们的值。但是,作为属性公开对于强类型字段访问可能很有用。



