Elasticsearch 查询结果分组统计,聚合检索(group by stats) Elasticsearch 发布于2021-03-05 / 更新于2021-09-15 04:05
前言 在使用Elasticsearch做搜索的时候,经常会碰到需要将搜索的结果分好类别,每个只取指定数量给到前端,举个例子:斗鱼直播平台搜索
假设搜索结果就分三个组:相关主播 , 相关视频 , 相关UP主 再假设所有组的数据都存储在同一个索引
假设索引结构 data: 综合搜索展示的简要数据 content: 搜索关键词集合, 例如: "卢本伟,55开,世界第一小鱼人,英雄联盟" type: 类别, 例如: 主播,视频,UP主 weight: 权重
{
"settings" : {
"number_of_shards" : 1
} ,
"mappings" : {
"properties" : {
"data" : {
"type" : "object"
} ,
"content" : {
"type" : "text" ,
"analyzer" : "ik_max_word" ,
"search_analyzer" : "ik_smart"
} ,
"type" : {
"type" : "keyword"
} ,
"weight" : {
"type" : "keyword"
}
}
}
}
查询结果分组统计 将结果按类别分组,每个组都按权重进行倒序,每组只展示前6个,只保留data
数据项 {
"size" : 0 ,
"query" : {
"match_phrase" : {
"content" : "大神"
}
} ,
"aggs" : {
"ret" : {
"terms" : {
"field" : "type" ,
"size" : "3"
} ,
"aggs" : {
"type" : {
"terms" : {
"field" : "type" ,
"size" : 3
} ,
"aggs" : {
"top" : {
"top_hits" : {
"sort" : [
{
"weight" : {
"order" : "desc"
}
}
] ,
"_source" : [
"data"
] ,
"size" : 6
}
}
}
}
}
}
}
}
如果每个类别都需要单独定制参数,比如主播按权重倒序, 视频按发布时间倒序 {
"size" : 0 ,
"query" : {
"match_phrase" : {
"content" : "大神"
}
} ,
"aggs" : {
"anchor" : { //主播
"filter" : {
"bool" : {
"must" : {
"term" : {
"type" : "1"
}
}
}
} ,
"aggs" : {
"type" : {
"terms" : {
"field" : "type" ,
"size" : 1
} ,
"aggs" : {
"top" : {
"top_hits" : {
"sort" : [
{
"weight" : {
"order" : "desc"
}
}
] ,
"_source" : [
"data"
] ,
"size" : 6
}
}
}
}
}
} ,
"video" : { //视频
"filter" : {
"bool" : {
"must" : {
"term" : {
"type" : "2"
}
}
}
} ,
"aggs" : {
"type" : {
"terms" : {
"field" : "type" ,
"size" : 1
} ,
"aggs" : {
"top" : {
"top_hits" : {
"sort" : [
{
"create_time" : {
"order" : "desc"
}
}
] ,
"_source" : [
"data"
] ,
"size" : 6
}
}
}
}
}
}
}
}
结语 Elasticsearch
的功能非常强大,个人偏向于能在Elasticsearch
上完成的事不会放在php
代码中处理, 如果你有更便捷更好的写法欢迎分享
讨论