ES在分布式系统中深度分页

111 阅读2分钟
搭建:
master的es的comfig目录下修改 elasticsearch.yml
#  集群名称cluster.name: xiaoming#  master名称node.name: masternode.master: truenetwork.host: 127.0.0.1
salver1的es的comfig目录下修改 elasticsearch.yml
cluster.name: xiaomingnode.name: slave-8200network.host: 127.0.0.1http.port: 8200discovery.zen.ping.unicast.hosts: ["127.0.0.1"]
salver的es的comfig目录下修改 elasticsearch.yml
cluster.name: xiaomingnode.name: slave-8000network.host: 127.0.0.1http.port: 8000discovery.zen.ping.unicast.hosts: ["127.0.0.1"]

启动:
cd “安装目录”
9200: 
sh ./elasticsearch-6.3.1/bin/elasticsearch -d 
8200:
sh ./elasticsearch-6.3.1_slave1/bin/elasticsearch -d 
8000:
sh ./elasticsearch-6.3.1_slave2/bin/elasticsearch -d 

停止:
ps -ef | grep elasticsearch
kill -9 “PID”

安装完毕之后,直接下载我的github代码,上手操作理解吧:github.com/singgel/NoS…

空搜索 :

GET /_search

结果:

{
   "took": 49,
   "timed_out": false,
   "_shards": {
      "total": 43,
      "successful": 43,
      "skipped": 0,
      "failed": 0
   },
   "hits": {
      "total": 16,
      "max_score": 1,
      "hits": [
         {
            "_index": "website",
            "_type": "blog",
            "_id": "9D_W0GQBGcdok5AB5UY-",
            "_score": 1,
            "_source": {
               "title": "My second blog post"
            }
         },
。。。。

在之前的 空搜索 中说明了集群中有 14 个文档匹配了(empty)query 。 但是在 hits 数组中只有 10 个文档。如何才能看到其他的文档?

和 SQL 使用 LIMIT 关键字返回单个 page 结果的方法相同,Elasticsearch 接受 from 和 size 参数:

size

显示应该返回的结果数量,默认是 10

from

显示应该跳过的初始结果数量,默认是 0

如果每页展示 5 条结果,可以用下面方式请求得到 1 到 3 页的结果:

GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10

考虑到分页过深以及一次请求太多结果的情况,结果集在返回之前先进行排序。 但请记住一个请求经常跨越多个分片,每个分片都产生自己的排序结果,这些结果需要进行集中排序以保证整体顺序是正确的。

 

理解为什么深度分页是有问题的,我们可以假设在一个有 5 个主分片的索引中搜索。 当我们请求结果的第一页(结果从 1 到 10 ),每一个分片产生前 10 的结果,并且返回给 协调节点 ,协调节点对 50 个结果排序得到全部结果的前 10 个。

现在假设我们请求第 1000 页--结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。 然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。

可以看到,在分布式系统中,对结果排序的成本随分页的深度成指数上升。这就是 web 搜索引擎对任何查询都不要返回超过 1000 个结果的原因。