我们需要在一个int [1,2,3,4,5,6]数组的字段中创建facet。 如果我们将此字段映射为Text,则Elasticsearch会抛出异常。如果我们将其标记为关键字,则我们不会获得方面中的所有单个项目。
如何通过NEST库(版本5)实现这一目标
非常感谢
答案 0 :(得分:1)
将其映射为整数。 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 mappingpublic 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