通过elasticsearch中的缓存搜索查询进行分页

时间:2013-05-12 15:45:00

标签: elasticsearch

如何从查询的缓存副本中获取分页查询中的数据?

搜索时,我们默认获得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
}'

是每次在服务器上执行的查询,然后返回“页面”?或者是第一次缓存和执行查询?

我可以看到两个用例的用途:

  1. 如果每次都重新执行,这将反映可能发生的文档的更改。
  2. 如果它被缓存,它将在服务器上创建更少的负载。具体来说,这可用于创建从服务器到客户端的某些“reducer”的“流式传输”。 (在这种情况下,我希望查询返回到下一页的链接。)
  3. 如何执行这两种情况。哪一个是默认的?

    此外,如果我的查询将运行排序脚本会发生什么?例如:

    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
    }'
    

    将随机排序应用两次(所以我可能会在两个查询中出现一些项目)?如何防止这种情况并将查询“锁定”为分页?

1 个答案:

答案 0 :(得分:1)

两年前的问题,没有答案。我回答是因为我讨厌遇到未解决的问题,而且我在做点什么。

ElasticSearch提供的功能是Scroll API(可返回v0.9,仍可在1.5中使用,但几乎没有变化)

此功能允许您存储缓存的查询结果集(默认到期时间为1分钟)。除非您在此1米内进行另一次跟进查询,否则查询结果集将被发送到更新版本的分片。

当您拥有大量实时和移动数据时,这非常方便。在迁移或更新映射期间向/从索引迁移数据时特别有用。