sorting - 如何在Elasticsearch中基于存储的字段值获取前5个文档?

标签 sorting elasticsearch filter elasticsearch-aggregation

示例-一门学生的考试成绩存储在Elastic搜索索引中。现在,我想找到在该学科中得分最高的前5名学生。

最佳答案

让我通过使用示例来展示它,但是首先要理解这个概念。

首先基于给定的主题(在我的示例中为著名的math主题:)进行查询,然后将获取所有具有math主题的学生,之后按照sort顺序按其desc排序score,然后size参数将结果限制为排名靠前的k学生。

与答案相关的展示链接:

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-from-size.html

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-sort.html

创建一个索引

{
    "mappings": {
        "properties": {
            "sid": {
                "type": "integer"
            },
            "subject" :{
                "type" : "keyword"
            },
            "score" :{
                "type" : "integer"
            }
        }
    }
}

为一些文档编制索引
{
   "sid" : 1,
   "subject" :"math",
   "score" : 50
}

{
   "sid" : 2,
   "subject" :"math",
   "score" : 60
}
{
   "sid" : 3,
   "subject" :"math",
   "score" : 70
}
{
   "sid" : 4,
   "subject" :"math",
   "score" : 90
}
{
   "sid" : 5,
   "subject" :"math",
   "score" : 99
}

{
   "sid" : 6,
   "subject" :"math",
   "score" : 100
}

搜索查询以搜索subject并基于标记对结果排序并返回前3名学生。
{
    "sort": [
        {
            "score": {
                "order": "desc" --> define sort order
            }
        }
    ],
    "query": {
        "term": {
            "subject": "math"
        }
    },
    "size":3 -->important, you can change it to fetch top K students, Just change 3 to whatever no you want to fetch.
}

搜索查询结果
{
            "_index": "leaderboard",
            "_type": "_doc",
            "_id": "5",
            "_score": null,
            "_source": {
               "sid": 6,
               "subject": "math",
               "score": 100
            },
            "sort": [
               100
            ]
         },
         {
            "_index": "leaderboard",
            "_type": "_doc",
            "_id": "4",
            "_score": null,
            "_source": {
               "sid": 4,
               "subject": "math",
               "score": 90
            },
            "sort": [
               90
            ]
         },
         {
            "_index": "leaderboard",
            "_type": "_doc",
            "_id": "3",
            "_score": null,
            "_source": {
               "sid": 3,
               "subject": "math",
               "score": 70
            },
            "sort": [
               70
            ]
         }

关于sorting - 如何在Elasticsearch中基于存储的字段值获取前5个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60523449/

相关文章:

arrays - Ajax DATA 更​​改排序

php - Elasticsearch 报错 No alive nodes found in your cluster

authentication - 使用 Nginx 进行 ElasticSearch 集群身份验证

elasticsearch - ELK类型转换-不是数字而是字符串

php - 如何在 PHP 中更快地过滤我的电子邮件?

python 等效于 filter() 获取两个输出列表(即列表的分区)

JQuery 数据表就绪事件?

java - 用Java更新游戏记录

javascript - 可排序的容器/边界

sorting - 如何检查自定义结构的 slice 是否已排序?