Elasticsearch分页搜索

Elasticsearch分页搜索教程

我们在使用 Elasticsearch 进行分页搜索时,通过指定 from 和 size 两个字段来分别指定从哪条记录开始获取和获取多少条记录。

其中 from 从 0 开始,而不是从 1 开始。

deep paging说明

简单来说,就是搜索的特别深,比如总共有 60000 条数据,每个 shared 上分了 20000 条数据,每页都是 10 条数据,这个时候,你要搜索到第 1000 页,实际上要拿到的是 10001 ~ 10010,那么该从第几条返回到第几条呢

每个 shard,其实都要返回的是最后 10 条数据,其实这个理解是错误的。

你的请求首先可能是打到一个不包含这个 index 的 shard 的 node 上去,这个 node 就是一个 coordinate node,那么这个 coordinate node 就会将搜索请求转发到 index 的三个 shard 所在的 node 上去。

比如说我们刚才说的情况下,要搜索 60000 条数据中的第 1000 页,实际上每个 shard 都要将内部的 20000 条数据中的第 10001 ~ 10010 条数据,拿出来,不是才 10 条,是 10010 条数据,3 个 shard 每个 shard 都返回 10010 条数据给 coordinate node,coordinate node 会总共收到 30030 条数据,然后在这些数据中进行排序,_socre,相关度分数,然后取到排位最高的前 10 条数据,其实就是我们要的最后 1000 页的 10 条数据。

deep paging性能问题

搜索的过深的时候,就需要在 coordinate node 上保存大量的数据,还要进行大量数据的排序,排序之后,再取出对应的那一页,所以这个过程,既耗网络带宽,耗费内存,还耗费 CPU,所以 deep paging 的性能问题,我们应该尽量避免出现这种 deep pagind 操作。

Elasticsearch分页搜索详解

语法

GET /indexname/_search { "query":{}, "from": startIndex, "size": pageSize }

参数

参数 描述
indexname 需要搜索的索引名
startIndex 从那一条记录开始返回
pageSize 分页的每页数据大小

说明

startIndex 从 0 开始,而不是从 1 开始。

案例

分页搜索记录

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

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

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

01_Elasticsearch分页查询.png

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

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

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

02_Elasticsearch分页查询.png

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

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

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

03_Elasticsearch分页查询.png

即,我们再次成功创建了一个文档,现在,我们进行文档的分页搜索,具体命令如下:

GET /haicodernet/_search { "query":{ "match_all": {} }, "from":0, "size":1 }

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

04_Elasticsearch分页查询.png

我们看到,我们使用 DSL 分页搜索了第一页的一条记录,结果告诉我们返回了一条记录,一共有三条记录,现在,我们,再次使用如下命令,查询第二页数据,具体命令如下:

GET /haicodernet/_search { "query":{ "match_all": {} }, "from":1, "size":1 }

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

05_Elasticsearch分页查询.png

我们看到,再次返回了第二页的一条记录,同样,我们可以一次查询多条记录,具体命令如下:

GET /haicodernet/_search { "query":{ "match_all": {} }, "from":0, "size":3 }

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

06_Elasticsearch分页查询.png

这次,我们设置了每页的页大小为 3,因此,返回了三条记录。

Elasticsearch分页搜索总结

我们在使用 Elasticsearch 进行分页搜索时,通过指定 from 和 size 两个字段来分别指定从哪条记录开始获取和获取多少条记录。

其中 from 从 0 开始,而不是从 1 开始。