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