Elasticsearch - 将具有不同值的文档置于结果顶部
Elasticsearch - bring documents with distinct values to the top of results
所以假设我有一个 '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 但无济于事。
您可以使用 cardinality
指标从 elasticsearch 数据中获取唯一计数。
以下link可以帮助-
https://www.elastic.co/guide/en/elasticsearch/guide/master/cardinality.html
您可以使用词条聚合通过 author_id 生成 "group by" 结果,并结合使用 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}}
}
}
}
所以我最终使用了 Field Collapsing,它基本上允许您进行常规查询并 'collapse' 基于特定字段的结果。因此,不是让每个结果一个接一个地出现,而是在该字段中获得每个不同值的最高结果。然后,您可以使用 inner_hits 获取每个不同值的 n 个帖子的列表,您可以使用 from/size 对每个组进行分页。
所以假设我有一个 '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 但无济于事。
您可以使用 cardinality
指标从 elasticsearch 数据中获取唯一计数。
以下link可以帮助- https://www.elastic.co/guide/en/elasticsearch/guide/master/cardinality.html
您可以使用词条聚合通过 author_id 生成 "group by" 结果,并结合使用 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}}
}
}
}
所以我最终使用了 Field Collapsing,它基本上允许您进行常规查询并 'collapse' 基于特定字段的结果。因此,不是让每个结果一个接一个地出现,而是在该字段中获得每个不同值的最高结果。然后,您可以使用 inner_hits 获取每个不同值的 n 个帖子的列表,您可以使用 from/size 对每个组进行分页。