如何从查询的缓存副本中获取分页查询的数据?
搜索时,默认情况下我们会得到 10 个结果(最多)。 我们还可以指定“大小”和“来自”。
但是,(查看一个简单的查询,只是为了使其更简单)我想知道,如果我这样分页:
curl -XPOST 'http://localhost:9200/index1/type1/_search' -d '{
"query": {
"match_all": {}
},
"from": 0,
"size": 10
}'
curl -XPOST 'http://localhost:9200/index1/type1/_search' -d '{
"query": {
"match_all": {}
},
"from": 10,
"size": 10
}'
curl -XPOST 'http://localhost:9200/index1/type1/_search' -d '{
"query": {
"match_all": {}
},
"from": 20,
"size": 10
}'
是不是每次在服务器上执行一次查询,然后返回一个“页面”?或者查询是否仅在第一次被缓存并执行?
我可以看到这两个用例的用途:
- 如果每次都重新执行,这将反射(reflect)可能发生的文档更改。
- 如果它被缓存,它将大大减少服务器上的负载。具体来说,这可以用于创建从服务器到客户端的某个“reducer”的“流”。 (在这种情况下,我希望查询返回下一页的链接)。
我该如何执行这两种情况。哪一个是默认的?
此外,如果我的查询运行排序脚本会发生什么?例如:
curl -XPOST 'http://localhost:9200/index1/type1/_search' -d '{
"query": {
"match_all": {}
},
"sort": {
"_script": {
"script": "Math.random()",
"type": "number",
"order": "asc"
}
},
"from": 0,
"size": 10
}'
curl -XPOST 'http://localhost:9200/index1/type1/_search' -d '{
"query": {
"match_all": {}
},
"sort": {
"_script": {
"script": "Math.random()",
"type": "number",
"order": "asc"
}
},
"from": 10,
"size": 10
}'
随机排序是否会应用两次(这样我可能会得到一些项目出现在两个查询中)?如何防止这种情况并将查询“锁定”到分页?
最佳答案
两年前的问题,没有答案。我回答是因为我讨厌遇到未回答的问题,而且我正在尽自己的一份力量。
ElasticSearch 提供的一项功能是 Scroll API (可返回 v0.9,并且在 1.5 中仍然可用,几乎没有变化)
此功能允许您存储缓存的查询结果集(默认过期时间为 1 分钟)。除非您在这 1m 内再次进行后续查询,否则查询结果集将被发送到分片以获取更新版本。
当您有大量实时和移动数据时,这非常方便。当您在映射迁移或更新期间将数据迁移到索引或从索引迁移数据时特别有用。
关于elasticsearch - 在elasticsearch中对缓存的搜索查询进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16509090/