我有一个查询,可以从弹性索引中获取一些用户发布数据。我很满意该查询,但我需要让它返回具有唯一用户名的行。当前,它显示用户的相关帖子,但它可能会显示一个用户两次..
{
"query": {
"bool": {
"should": [
{ "match_phrase": { "gtitle": {"query": "voice","boost": 1}}},
{ "match_phrase": { "gdesc": {"query": "voice","boost": 1}}},
{ "match": { "city": {"query": "voice","boost": 2}}},
{ "match": { "gtags": {"query": "voice","boost": 1} }}
],"must_not": [
{ "term": { "profilepicture": ""}}
],"minimum_should_match" : 1
}
}
}
我已阅读有关聚合的内容,但对此并不了解(也尝试使用aggs但也无法使用)....任何帮助表示赞赏
答案 0 :(得分:3)
您需要使用terms aggregation来获取所有唯一身份用户,然后使用top hits aggregation为每个用户只获取一个结果。这就是它的外观。
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"gtitle": {
"query": "voice",
"boost": 1
}
}
},
{
"match_phrase": {
"gdesc": {
"query": "voice",
"boost": 1
}
}
},
{
"match": {
"city": {
"query": "voice",
"boost": 2
}
}
},
{
"match": {
"gtags": {
"query": "voice",
"boost": 1
}
}
}
],
"must_not": [
{
"term": {
"profilepicture": ""
}
}
],
"minimum_should_match": 1
}
},
"aggs": {
"unique_user": {
"terms": {
"field": "userid",
"size": 100
},
"aggs": {
"only_one_post": {
"top_hits": {
"size": 1
}
}
}
}
},
"size": 0
}
此处size
内部用户聚合为100,如果您有更多唯一身份用户(默认值为10),则可以增加该值,最外层size
为零,仅获取聚合结果。要记住的一件重要事情是您的用户ID必须是唯一的,即 ABC 和 abc 将被视为不同的用户,您可能必须使用户ID not_analyzed
确定这一点。 More就此而言。
希望这会有所帮助!!