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 对每个组进行分页。