PHP分页+Elasticsearch查询

分页,本质上就是根据给定的页码和偏移量从服务器端请求数据。原理很easy,实践起来却有诸多问题,这里总结一下目前使用的分页demo,通过es请求数据,前端自己构建页码。

这里写图片描述

html的页码显示,有4个参数,$page-具体页码,$pagenum-页数总数,$s-起始页,$e-结束页,点击页码通过触发pageChange()函数进行分页 
跳转至指定页码的功能,通过id="jump"获取页码参数,通过跳转按钮触发pageJump()函数请求数据 
页码布局上使用bootstrap

 
  1. <div class="row" style="margin:-15px">

  2. <div class="col-xs-10 col-xs-offset-1">

  3. <div class="row">

  4. <div class="col-xs-7 remove-padding-r">

  5. <div class="dataTables_paginate paging_simple_numbers pull-right" style="float:left">

  6. <ul class="pagination">

  7. <li <?php if($page==1) echo 'class="disabled"'?>><a href="javascript:pageChange(1);">首页</a></li>

  8. <?php

  9. if($pagenum<=7)

  10. {

  11. $s=1;

  12. $e=$pagenum;

  13. }

  14. elseif ($page<=3)

  15. {

  16. $s=1;

  17. $e=7;

  18. }

  19. elseif ($page>=($pagenum-3))

  20. {

  21. $s=$pagenum-6;

  22. $e=$pagenum;

  23. }

  24. else

  25. {

  26. $s=$page-3;

  27. $e=$page+3;

  28. }

  29. for ($i=$s; $i <=$e ; $i++)

  30. {

  31. ?>

  32. <li <?php if($i==$page) echo 'class="active"';?>>

  33. <a href="javascript:pageChange(<?=$i?>);"><?=$i?></a>

  34. </li>

  35. <?php

  36. }

  37. ?>

  38. <li <?php if($page==$pagenum) echo 'class="disabled"'?>><a href="javascript:pageChange(<?=$pagenum?>);">末页</a></li>

  39. </ul>

  40. </div>

  41. </div>

  42. <div class="col-xs-5 remove-padding-l" style="padding-top:20px">

  43. <span>共<?=$pagenum?>页</span>

  44. <input type="text" class="form-control form-focus-blue" id="jump" style="width:70px;display: inline-block;" placeholder="页数" >

  45. <button class="btn btn-blue btn-sm" onclick="javascript:pageJump();" style="margin-bottom:3px;display: inline-block;">跳转</button>

  46. </div>

  47. </div>

  48. </div>

  49. </div>

html控制每页显示数据条数,默认选中5条,下拉菜单可以选择其他选项,id="pageItem"获取每页的数据量,选中后触发pageItem()函数请求数据

 
  1. <div class="block-content">

  2. 共 <span id="itemNum"></span> 条,每页显示条数:

  3. <select class="form-focus-blue" style="width:48px; display: inline-block;" onchange="javascript:pageItem();" id="pageItem">

  4. <option value="5">5</option>

  5. <option value="10">10</option>

  6. <option value="25">25</option>

  7. <option value="50">50</option>

  8. <option value="100">100</option>

  9. </select>

  10. </div>

html表单,便于提交到服务器请求数据pagesize是每页的数据量大小,这里默认为5,page是请求的页码,默认为1

 
  1. <form id="variable">

  2. <input type="hidden" name="pagesize" value="5">

  3. <input type="hidden" name="page" value="1">

  4. </form>

javascript上面html中涉及到的三个函数,以及es查询

 
  1. <script>

  2. // 控制页面显示的数据量

  3. function pageItem ()

  4. {

  5. var pagesize = $("#pageItem").val();

  6. $("input[name='pagesize']").val(pagesize);

  7. $("input[name='page']").val("1");

  8. Elasticsearch();

  9. return false;

  10. }

  11. // 跳转至指定页面

  12. function pageJump ()

  13. {

  14. var jump = $("#jump").val();

  15. var itemNum = 10000;// 数据总量,此处假定为10000

  16. var pagesize = $("#pageItem").val();

  17. var pagenum = Math.ceil(itemNum/pagesize);

  18. if (1 <= jump && jump <= pagenum)

  19. pageChange(jump);

  20. else if(jump < 1)

  21. alert("请输入跳转页数╰( ̄▽ ̄)╭ ");

  22. else

  23. alert("跳转内容超出范围啦(ಥ_ಥ) ")

  24. }

  25. // 跳转函数在这里

  26. function pageChange (p)

  27. {

  28. // 将要跳转的页码存到HTML表单中

  29. $("input[name='page']").val(p);

  30. // es查询

  31. Elasticsearch();

  32. scrollTo(0,0);

  33. return false;

  34. }

  35. // 重点来了,es查询

  36. function Elasticsearch() {

  37. $.ajax({

  38. type:"POST",

  39. url:"xxx/Elasticsearch",

  40. data:$("#variable").serialize(),

  41. success:function(data){

  42. console.log(data);

  43. }

  44. });

  45. }

  46. </script>

服务器端把传经来的两个参数,pagesizepage丢给es去查询

 
  1. ... ...

  2.  
  3. public function Elasticsearch(){

  4. $pagesize = $_POST["pagesize"];

  5. $page = $_POST["page"];

  6. $input = array(

  7. "page" => $page,

  8. "pagesize" => $pagesize

  9. );

  10. $es_connection_info = $this->my_elasticsearch->es_get_connection_info("host", "port", "index", "type");

  11. $es_search = $this->my_elasticsearch->es_search($es_connection_info, $input);

  12. $result = json_decode($es_search, True);

  13. ... ...

  14. }

  15. ... ...

es查询函数

 
  1. ... ...

  2.  
  3. public function es_search ($es_connection_info, $input) {

  4. $host = $es_connection_info['host'];

  5. $port = $es_connection_info['port'];

  6. $index = $es_connection_info['index'];

  7. $type = $es_connection_info['type'];

  8.  
  9. if(is_array($input)){

  10. if(array_key_exists("page",$input)){

  11. $page = $input["page"]; //page for offset(es_from);

  12. }else{

  13. $page = "";

  14. }

  15. if(array_key_exists("pagesize",$input)){

  16. $pagesize = $input["pagesize"]; //es_size;

  17. }else{

  18. $pagesize = "";

  19. }

  20. }

  21.  
  22. $arr = "123123";

  23. $data = array(

  24. "query" =>

  25. array("bool" =>

  26. array("must"=>

  27. array("match_all" => $arr)

  28. )

  29. )

  30. );

  31.  
  32. // pagesize/from

  33. $data["size"] = $pagesize;

  34. $data["from"] = ($page-1)*$pagesize;

  35.  
  36. $url = 'http://' . $host . ':' . $port . '/' . $index . '/'.$type.'/_search';

  37. $json_data = json_encode($data);

  38. $json_data = str_replace('"123123"',"{}",$json_data);

  39. $data = $this->curl($url, $json_data, $port);

  40. return $data;

  41. }

  42. ... ...

  •  

请求回来的数据返回到前端再进行必要的展示就OK了

转载于:https://my.oschina.net/u/3371661/blog/3030143

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值