Elasticsearch-将具有不同值的文档置于结果顶部

时间:2019-06-17 23:43:37

标签: elasticsearch elasticsearch-painless

例如,假设我有一个'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,但无济于事。

3 个答案:

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