使用Nest Client在Elasticsearch中将嵌套属性复制到父对象
如何在索引映射定义中将嵌套属性复制到包含POCO的字段中?
当两个字段处于同一对象级别时, 我能够成功地将一个属性复制到另一个属性中.CopyTo
。
但是,我正在努力将嵌套对象上的属性复制到父对象上的属性。
给定以下对象,我想将“街道”从“人”的“地址”属性复制到“人”的“搜索”属性中
Person{
public string Search { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
}
Address
{
public string Street { get; set; }
}
如下所示,将“姓氏”映射到“搜索”很简单。
.Map<Person>(map => map .AutoMap()
.Properties(properties => properties
.Text(text =>
text.Name(name => name.LastName)
.CopyTo(copyTo =>
copyTo.Field(field => field.Search)
)
)
)
但是我无法弄清楚将’Person.Address.Street’复制到’Person.Search’的Nest语法
回答:
这是你怎么做
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
不会包含它们的值。但是,作为属性公开对于强类型字段访问可能很有用。
以上是 使用Nest Client在Elasticsearch中将嵌套属性复制到父对象 的全部内容, 来源链接: utcz.com/qa/408993.html