【发布时间】:2017-07-10 09:54:02
【问题描述】:
我们需要在一个 int [1,2,3,4,5,6] 数组的字段中创建构面。 如果我们将此字段映射为文本,Elasticsearch 会抛出异常。如果我们将其标记为关键字,我们不会得到构面中的所有单个项目。
如何使用 NEST 库(第 5 版)实现这一目标
非常感谢
【问题讨论】:
标签: elasticsearch nest
我们需要在一个 int [1,2,3,4,5,6] 数组的字段中创建构面。 如果我们将此字段映射为文本,Elasticsearch 会抛出异常。如果我们将其标记为关键字,我们不会得到构面中的所有单个项目。
如何使用 NEST 库(第 5 版)实现这一目标
非常感谢
【问题讨论】:
标签: elasticsearch nest
将其映射为整数。 NEST's automapping 默认会为其推断一个整数映射
给定以下类型
public class Message
{
public int[] Integers { get; set; }
}
自动映射看起来像
var client = new ElasticClient();
client.CreateIndex("messages", c => c
.Mappings(m => m
.Map<Message>(mm => mm
.AutoMap()
)
)
);
产生以下映射
{
"mappings": {
"message": {
"properties": {
"integers": {
"type": "integer"
}
}
}
}
}
如果要显式控制映射,可以使用attribute mapping
public class Message
{
[Number(NumberType.Integer)]
public int[] Integers { get; set; }
}
var client = new ElasticClient();
client.CreateIndex("messages", c => c
.Mappings(m => m
.Map<Message>(mm => mm
.AutoMap()
)
)
);
或fluent mapping,如果您希望将映射与您的 POCO 分开
client.CreateIndex(messagesIndex, c => c
.Mappings(m => m
.Map<Message>(mm => mm
.AutoMap()
.Properties(p => p
.Number(n => n
.Name(nn => nn.Integers)
.Type(NumberType.Integer)
)
)
)
)
);
client.CreateIndex(messagesIndex, c => c
.Mappings(m => m
.Map<Message>(mm => mm
.AutoMap()
.Properties(p => p
.Scalar(n => n.Integers)
)
)
)
);
映射到位后,整数值的分面看起来像
client.IndexMany(new[] {
new Message { Integers = new [] { 1, 2, 3 } },
new Message { Integers = new [] { 3, 4, 5 } },
new Message { Integers = new [] { 1, 4, 5 } },
});
client.Refresh(messagesIndex);
var searchResponse = client.Search<Message>(s => s
.Size(0)
.Aggregations(a => a
.Terms("ints", t => t
.Field(f => f.Integers)
)
)
);
foreach (var bucket in searchResponse.Aggs.Terms<int>("ints").Buckets)
{
Console.WriteLine($"{bucket.Key}:{bucket.DocCount}");
}
产生
1:2
3:2
4:2
5:2
2:1
【讨论】: