【问题标题】:Alternative for multifield mapping in Elasticsearch.net v. 2.3+ library (c#)?Elasticsearch.net v. 2.3+ 库(c#)中多字段映射的替代方案?
【发布时间】:2016-07-28 12:54:10
【问题描述】:
我的问题:
我有一个带有字符串属性的索引,我在其上执行查询和聚合。我想对正在分析的属性执行术语查询,并在未分析该属性的情况下执行术语聚合。在以前版本的弹性搜索中,有一个多字段映射,但自该库的 2.0 版本以来它就消失了。我怎样才能做到这一点?
旁注:
我想避免在我的索引中复制该属性并将其中一个重复标记为已分析,另一个标记为未分析,因为它似乎不是有效的解决方案。
我使用的库 (c#): Elasticsearch.net 2.3.3 和 NEST 2.3.3。
欢迎提出任何建议。
【问题讨论】:
标签:
c#
.net
elasticsearch
nest
【解决方案1】:
multi_field 映射仍然存在于 Elasticsearch 2.x 和 NEST 2.x 中;这是一个例子
client.Map<Document>(m => m
.Index("index-name")
.AutoMap()
.Properties(p => p
.String(s => s
.Name(n => n.Location)
.Fields(f => f
.String(fs => fs
.Name("raw").NotAnalyzed()
)
)
)
)
);
这里Location 属性被映射为multi_field,并应用了默认的Standard 分析器;这将在索引内的location 字段内。此外,location.raw 字段已被编入索引,但未进行分析。
使用分析的location 属性执行术语查询将是
client.Search<Document>(s => s
.Query(q => q
.Term(f => f.Location, "location")
)
);
在术语聚合中使用未分析的属性将是
client.Search<Document>(s => s
.Size(0)
.Aggregations(a => a
.Terms("top_locations", ta => ta
.Field(f => f.Location.Suffix("raw"))
)
)
);