Elasticsearch scroll滚动搜索

Elasticsearch scroll滚动搜索教程

Elasticsearch 中,如果一次性要查出来比如 10 万条数据,那么性能会很差,此时一般会采取用 scroll 滚动查询,一批一批的查,直到所有数据都查询完处理完。

scoll,看起来挺像分页的,但是其实使用场景不一样。分页主要是用来一页一页搜索,给用户看的;scoll 主要是用来一批一批检索数据,让系统进行处理的。

scroll搜索原理

使用 scroll 滚动搜索,可以先搜索一批数据,然后下次再搜索一批数据,以此类推,直到搜索出全部的数据来。

scroll 搜索会在第一次搜索的时候,保存一个当时的视图快照,之后只会基于该旧的视图快照提供数据搜索,如果这个期间数据变更,是不会让用户看到的。

采用基于 _doc 进行排序的方式,性能较高。

每次发送 scroll 请求,我们还需要指定一个 scroll 参数,指定一个时间窗口,每次搜索请求只要在这个时间窗口内能完成就可以了。

scroll搜索详解

语法

GET /indexname/_search?scroll=1m { "query": { }, "size": n }

使用滚动搜索时,会返回一个 id,下次搜索时,必须带上该 id,第二次搜索语法如下:

GET /indexname/_search/scroll { "scroll": "1m", "scroll_id" : scrollId }

下次搜索时,带上上一次的滚动 id。

案例

滚动搜索

我们在 Kibana 的控制台上,输入以下代码,新建一个文档

PUT /haicodernet/_doc/1 { "index":"www.haicoder.net", "name" : "javascript", "desc" : "javascript module", "categorys" : 5, "author" : "jobs steven", "tags": [ "javascript", "vue" ] }

输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:

36_Elasticsearch scroll滚动搜索.png

我们看到,此时我们创建文档成功了,现在,我们再次输入以下代码,再次创建一条文档:

PUT /haicodernet/_doc/2 { "index":"www.haicoder.net", "name" : "server", "desc" : "server module", "categorys" : 10, "author" : "cainiao pei", "tags": [ "server", "python" ] }

输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:

37_Elasticsearch scroll滚动搜索.png

同样,我们再次创建一条记录,使用如下命令:

PUT /haicodernet/_doc/3 { "index":"www.haicoder.net", "name" : "tools", "desc" : "tools module", "categorys" : 15, "author" : "cainiao pei", "tags": [ "tools", "vim" ] }

即,我们再次成功创建了一个文档,现在,我们使用滚动搜索,首先查询第一条记录,具体命令如下:

GET /_search?scroll=1m { "query": { "match_all": {} }, "size": 2 }

输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:

38_Elasticsearch scroll滚动搜索.png

我们看到,一共返回了两条记录,并且返回了 scrollId,现在,第二次搜索,我们使用上一次返回的 scrollId,具体命令如下:

GET /_search/scroll { "scroll": "1m", "scroll_id": "DnF1ZXJ5VGhlbkZldGNoBgAAAAAAAJB4FnB1RmNGc2RLUk5PdXA1LWlVdHlDQXcAAAAAAACQeRZwdUZjRnNkS1JOT3VwNS1pVXR5Q0F3AAAAAAAAkHoWcHVGY0ZzZEtSTk91cDUtaVV0eUNBdwAAAAAAAJB9FnB1RmNGc2RLUk5PdXA1LWlVdHlDQXcAAAAAAACQexZwdUZjRnNkS1JOT3VwNS1pVXR5Q0F3AAAAAAAAkHwWcHVGY0ZzZEtSTk91cDUtaVV0eUNBdw==" }

输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:

39_Elasticsearch scroll滚动搜索.png

这次,我们带上了 scroll_id,查询了下一条记录。

Elasticsearch scroll滚动搜索总结

在 Elasticsearch 中,如果一次性要查出来比如 10 万条数据,那么性能会很差,此时一般会采取用 scroll 滚动查询,一批一批的查,直到所有数据都查询完处理完。