例如,假设我有一个'books'索引,每本书都有一个author_id。由于作者人数很少,因此作者ID在各本书中都会经常重复。我索引中的书看起来像这样:
{
"title": "Elasticsearch for dummies",
"author_id": 1,
"purchases": 10
},
{
"title": "Great book",
"author_id": 1,
"purchases": 5
},
{
"title": "Great book 2",
"author_id": 1,
"purchases": 8
},
{
"title": "My cool book",
"author_id": 2,
"purchases": 14
},
{
"title": "Interesting book title",
"author_id": 2,
"purchases": 20
},
{
"title": "amazing book",
"author_id": 2,
"purchases": 16
},
{
"title": "Silly Walks vol II",
"author_id": 3,
"purchases": 13
},
{
"title": "Wild animals you can pet",
"author_id": 3,
"purchases": 5
},
{
"title": "GoT Spoilers",
"author_id": 3,
"purchases": 4
}
想象一下,有成千上万的书籍,只有50位作者。如果仅按购买进行排序,我将获得一个结果页面,其中仅显示一两位作者的书籍。我需要的是让尽可能多的作者参与结果。我可以使用function_score + script_score的某种组合来实现此目的吗?我尝试用一种轻松的脚本尝试Math.exp,但无济于事。
答案 0 :(得分:0)
您可以使用cardinality
指标来从Elasticsearch数据中获取唯一计数。
下面的链接可以帮助- https://www.elastic.co/guide/en/elasticsearch/guide/master/cardinality.html
答案 1 :(得分:0)
您可以使用术语聚合通过author_id与tophits聚合的组合来对结果进行“分组”,以仅获取每个作者的少量结果。 因此,类似这样的内容应该给出按书单排序的作者列表,该书具有最大购买数量,其中每个作者都拥有按购买数量排序的他最多撰写的3本书。
aggs: {
authors: {
terms: {
field: 'author_id',
order: { max_purchases: desc }
},
aggs: {
books: {
top_hits: {
size: 3,
_source: {include: ['title', 'purchases']},
sort: [{purchases: {order: desc } }]
},
max_purchase : { max : { field : purchases}}
}
}
}
答案 2 :(得分:0)
因此,我最终使用了Field Collapsing,它基本上允许您进行常规查询并基于特定字段“折叠”结果。因此,您不必让每个结果都一个接一个,而是在该字段中获得每个不同值的最高结果。然后,您可以使用inner_hits为每个不同的值获取n个帖子的列表,并可以使用from / size来对每个组进行分页。