面试题答案
一键面试映射设置
- 嵌套对象映射:因为评论是嵌套在文章文档中的数组,需要在映射中指定评论字段为
nested
类型。例如:
{
"mappings": {
"properties": {
"article_title": { "type": "text" },
"comments": {
"type": "nested",
"properties": {
"commenter": { "type": "keyword" },
"like_count": { "type": "integer" }
}
}
}
}
}
这里将 comments
字段定义为 nested
类型,确保对其内部对象的操作能正确处理数组中的每个元素。commenter
使用 keyword
类型以便进行分组聚合,like_count
使用 integer
类型存储点赞数。
查询语句
使用 aggs
关键字来定义聚合。
{
"size": 0,
"aggs": {
"commenters": {
"nested": {
"path": "comments"
},
"aggs": {
"by_commenter": {
"terms": {
"field": "comments.commenter",
"size": 100
},
"aggs": {
"sort_by_likes": {
"top_hits": {
"sort": [
{
"comments.like_count": {
"order": "desc"
}
}
],
"size": 10
}
}
}
}
}
}
}
}
- 外层聚合:
nested
聚合指定path
为comments
,这表示我们要对comments
这个嵌套数组进行操作。
- 按评论者分组:
- 在
nested
聚合内部,terms
聚合按comments.commenter
字段进行分组,size
设置为100,表示最多返回100个评论者分组。
- 在
- 按点赞数排序:
- 在每个评论者分组内,使用
top_hits
聚合按comments.like_count
字段进行降序排序,size
设置为10,表示每个评论者分组内只返回点赞数最多的前10条评论。
- 在每个评论者分组内,使用
结果解读
- 整体结构:结果会以嵌套的JSON结构呈现。最外层是与查询对应的响应,其中
aggregations
字段包含我们定义的聚合结果。 - 评论者分组:
- 在
commenters.by_commenter
中,每个bucket
代表一个评论者分组,key
是评论者的名称,doc_count
是该评论者的评论数量。
- 在
- 按点赞数排序结果:
- 在每个评论者分组的
sort_by_likes.hits.hits
数组中,是按点赞数降序排列的评论。每个元素包含了对应评论的详细信息,如_source
中包含原始的评论数据,sort
数组中显示按点赞数排序的依据。例如:
- 在每个评论者分组的
{
"aggregations": {
"commenters": {
"doc_count": 100,
"by_commenter": {
"buckets": [
{
"key": "commenter1",
"doc_count": 5,
"sort_by_likes": {
"hits": {
"total": {
"value": 5,
"relation": "eq"
},
"hits": [
{
"_source": {
"comments": [
{
"commenter": "commenter1",
"like_count": 100
}
]
},
"sort": [
100
]
},
// 其他按点赞数降序排列的评论
]
}
}
},
// 其他评论者分组
]
}
}
}
}
通过上述映射设置、查询语句和结果解读,可以实现对嵌套在文章文档中的评论按评论者分组统计评论数量,并在每个评论者分组内按评论的点赞数进行排序的高级聚合功能。