我在我的项目中使用带有symfony2的foselasticabundle,mysql数据库中有entry和user表,每个条目都属于一个用户。
我只想从数据库的所有条目中为每个用户获取一个条目。
条目表示法
[
{
"id": 1,
"name": "Hello world",
"user": {
"id": 17,
"username": "foo"
}
},
{
"id": 2,
"name": "Lorem ipsum",
"user": {
"id": 15,
"username": "bar"
}
},
{
"id": 3,
"name": "Dolar sit amet",
"user": {
"id": 17,
"username": "foo"
}
},
]
预期结果是:
[
{
"id": 1,
"name": "Hello world",
"user": {
"id": 17,
"username": "foo"
}
},
{
"id": 2,
"name": "Lorem ipsum",
"user": {
"id": 15,
"username": "bar"
}
}
]
但它返回表中的所有条目。我尝试向elasticsearch查询添加聚合,但没有任何更改。
$distinctAgg = new \Elastica\Aggregation\Terms("distinctAgg");
$distinctAgg->setField("user.id");
$distinctAgg->setSize(1);
$query->addAggregation($distinctAgg);
有没有什么方法可以通过术语过滤器或其他方法来做到这一点?任何帮助都会很好。谢谢您。
1条答案
按热度按时间z8dt9xmd1#
当您习惯于使用mysql group by时,聚合并不容易理解。
首先,聚合结果不会返回到
hits
,但在aggregations
. 因此,当你得到搜索结果时,你必须得到这样的聚合:第二件事是聚合不会返回源代码。通过示例的聚合,您将只知道有1个id为15的用户和2个id为15的用户。
e、 g.通过此查询:
结果:
如果您想得到结果,就像在mysql中处理groupby一样,您必须使用
top_hits
子聚合:结果:
有关此页的更多信息:https://www.elastic.co/blog/top-hits-aggregation