Вот как вы можете это сделать
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_to
поля в Elasticsearch не обязательно должны быть представлены как свойство в C # POCO, так как _source
не будет содержать значения для них. Экспонирование как свойство, однако, может быть полезно для доступа к полям со строгой типизацией.