您尝试创建一个名称为“ companyName.completion”的属性,但是在该位置该属性无效,它将使用最后一个标记“completion”。因此,它实际上映射了一个称为完成的字段…。尝试将调用更改为:.Name(p => p.CompanyName)
您可以为,Contact
但在建立索引时使用Person
和Company
类型。
用您映射的Elasticsearch术语:
/index/contact/
但您的文档将进入:
/index/person/
和 /index/company
NEST不会自动映射特定类的所有实现,elasticsearch无法知道这三个类之间的关系。
var createResult = client.CreateIndex(indexName, index => index
.AddMapping<Contact>(tmd => MapContactCompletionFields(tmd))
.AddMapping<Person>(tmd => MapContactCompletionFields(tmd))
.AddMapping<Company>(tmd => MapContactCompletionFields(tmd))
);
private RootObjectMappingDescriptor<TContact> MapContactCompletionFields<TContact>(
RootObjectMappingDescriptor<TContact> tmd)
where TContact : Contact
{
return tmd.Properties(props => props
.Completion(s => s
.Name(p => p.CompanyName.Suffix("completion"))
.IndexAnalyzer("standard")
.SearchAnalyzer("standard")
.MaxInputLength(20)
.Payloads()
.PreservePositionIncrements()
.PreserveSeparators()
)
);
}
然后,当您搜索联系人时:
var result = getElasticClientInstance("contacts").Search<Contact>(
body => descriptor
.Types(typeof(Person), typeof(Company))
);