【发布时间】:2018-04-23 16:08:52
【问题描述】:
我现在学习用于 elasticsearch 的 Nest 6.x 客户端我想在子文档中使用术语搜索。我有这个课程:
public class BaseTest
{
public string Id { get; set; }
public SubBase SubDocument { get; set; }
public Guid TypeId { get; set; }
public string BaseTitel { get; set; }
}
public class SubBase
{
public int Id { get; set; }
public Guid IdGuid { get; set; }
public string Titel { get; set; }
}
并使用此映射创建索引:
.Mappings(mp => mp
.Map<BaseTest>(m => m
.Properties(pr => pr
.Keyword(kw => kw
.Name(nm => nm.BaseTitel)))
.Properties(pr => pr
.Keyword(kw => kw
.Name(nm => nm.TypeId)))
.Properties(pr => pr
.Keyword(kw => kw
.Name(nm => nm.SubDocument.Titel)))
.Properties(pr => pr
.Keyword(kw => kw
.Name(nm => nm.SubDocument.IdGuid)
))))
wenn 我尝试在 BaseTest 中搜索 GUID(或 GUID 格式的字符串,我将 SubBase.Titel 作为测试的 Guid 保存)值它可以在 BaseTest 中工作,但不能在 SubBase 中。 搜索我使用这个查询:
.Query(q => q
.ConstantScore(cs => cs
.Filter(f => f
.Term(t => t
.SubDocument.Titel, "5d511b8a-37c7-40c1-a5c3-4de13e16e379"))))
更新
新映射:
.Mappings(mp => mp
.Map<BaseTest>(m => m
.Properties(pr => pr
.Keyword(kw => kw
.Name(nm => nm.BaseTitel)
.Name(nm => nm.TypeId)
)
.Object<SubBase>(o => o
.Name(n => n.SubDocument)
.Properties(p => p
.Keyword(k => k
.Name(n => n.Titel)
.Name(n => n.IdGuid)))))))
现在我可以找到 Guid 属性,但不是字符串类型的属性,其值类似于“5d511b8a-37c7-40c1-a5c3-4de13e16e379”
【问题讨论】:
-
您的映射不正确。您只需调用
.Properties(),然后在其中映射所有字段(.Keyword()、.Text()等)。有关一些示例,请参阅映射文档:elastic.co/guide/en/elasticsearch/client/net-api/current/… -
@RussCam 谢谢,现在我可以找到 Guid 属性了。但如果此属性具有 Guid 格式的字符串类型,则将找不到它。我该怎么办?
-
> 属性具有 Guid 格式的字符串类型 - 我不明白你的意思。你能详细说明吗?
System.Guid序列化为string -
SubBase.Titel = "5d511b8a-37c7-40c1-a5c3-4de13e16e379"
-
好的,谢谢。 :-)。
标签: elasticsearch nest