如何在ElasticSearch中使用分页和排序扫描/滚动?

时间:2016-01-07 14:33:46

标签: python-2.7 sorting elasticsearch scroll pagination

我有一个ES DB存储我每天运行的进程的历史记录。因为我想在历史记录中每页只显示20条记录(按日期排序),所以我使用了分页(size + from_)组合滚动,这很好用。但是当我想在查询中使用排序时它没有用。所以我发现滚动排序不起作用。寻找另一种替代方案我尝试了ES辅助扫描,它可以很好地滚动和排序结果,但是这个解决方案分页看起来似乎没有用,我不明白为什么因为API说扫描发送底层搜索功能的所有参数。所以我的问题是,是否有任何方法可以将三个选项结合起来。

谢谢,

2 个答案:

答案 0 :(得分:2)

使用elasticsearch.helpers.scan函数时,您需要传递preserve_order=True才能启用排序。

(使用elasticsearch==7.5.1测试)

答案 1 :(得分:1)

是的,您可以将滚动与排序结合起来,但是,当您可以对字符串进行排序时,您需要更改映射才能正常工作,Documentation Here

  

为了对字符串字段进行排序,该字段应包含一个术语   only:整个not_analyzed字符串。但我们当然还需要   要分析的字段,以便能够将其作为全文查询。

     

以两种方式索引相同字符串的天真方法是   在文档中包含两个单独的字段:一个被分析的字段   搜索,以及未分析的分类。

"tweet": { 
    "type":     "string",
    "analyzer": "english",
    "fields": {
        "raw": { 
            "type":  "string",
            "index": "not_analyzed"
        }
    }
}
  
      
  • 推文字段与以前相同:已分析全文字段。
  •   
  • 新的 tweet.raw 子字段为 not_analyzed
  •   
     

现在,或者至少在我们重新编制数据索引后,我们就可以使用   用于搜索的 tweet字段和用于排序的 tweet.raw字段

GET /_search
    {
        "query": {
            "match": {
                "tweet": "elasticsearch"
            }
        },
        "sort": "tweet.raw"
    }