滚动搜索
现在有一个需求,把某个索引中1亿条数据下载下来存到数据库中。
如果一次查询出来,极有可能导致内存溢出,因此需要分批查询。除了我们上面说的分页查询以外,还可以使用滚动搜索技术 scroll
scroll搜索会在第一次搜索时,保留一个当时的快照,之后只会基于这个快照提供数据,这个时间段如果发生了数据的变更,用户不会感知。
每次发送scroll请求,我们还需要指定一个scroll参数和一个时间窗口。每次请求只要在这个时间窗口内完成就可以了 。
POST /article/_search?scroll=1m { "query": { "match_all": {} }, "size": 2 }
返回结果
{ "_scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAHgWU29BMG1xamtUelNuOEVvSTdWYjdPUQ==", "took": 3, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 4, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "article", "_type": "_doc", "_id": "1", "_score": 1, "_source": { "title": "Java从入门到精通", "red": 101, "content": "Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程" } } , { "_index": "article", "_type": "_doc", "_id": "2", "_score": 1, "_source": { "title": "JavaEE从入门到入土", "red": 50, "content": "Java EE 是 J2EE的一个新的名称,之所以改名,目的还是让大家清楚J2EE只是Java企业应用。在2004年底中国软件技术大会Ioc微容器(也就是Jdon框架的实现原理)演讲中指出:我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本" } } ] } }
获得的结果会有一个scoll_id,下一次再发送scoll请求的时候,必须带上这个scoll_id
POST /_search/scroll {"scroll":"1m","scroll_id":"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAHkWU29BMG1xamtUelNuOEVvSTdWYjdPUQ=="}