TP5 ElasticSearch搜索 分页 前端展示

ES检索条件是搜索的关键字不为空

1、如果检索条件为空 则从数据库中查询

        //接收参数
        $keywords = input('keywords');
        //如果$keywords为空则从数据库中查询数据
        if(empty($keywords)){
            //获取指定分类下商品列表
            if(!preg_match('/^\d+$/', $id)){
                $this->error('参数错误');
            }
            //查询分类下的商品
            $list = \app\common\model\Goods::where('cate_id', $id)->order('id desc')->paginate(10);
            $arr['current_page'] = $list->currentPage();//当前页
            $arr['prev_page'] = $list->currentPage() -1 <= 1 ? 1 : $list->currentPage()-1;//上一页
            $arr['next_page'] = $list->currentPage() +1 >= $list->lastPage() ? $list->lastPage() : $list->currentPage()+1;//下一页
            $arr['last_page'] = $list->lastPage();//总页数
            $arr['data'] = $list->items();//数据
            //查询分类名称
            $category_info = \app\common\model\Category::find($id);
            $cate_name = $category_info['cate_name'];
            //返回页面
            return view('index', ['list' => $arr, 'cate_name' => $cate_name]);
        }

2、如果检索条件不为空则从ES中搜索

            //不为空,则从ES中查询数据
            try{
                $page = input('page',1);//页码
                $size = 10;//每页显示条数
                $limit = ($page-1)*$size;//偏移量
                $client = ClientBuilder::create()->build();
                $params = [
                    'index' => 'goods',
                    //'type' => '_doc',
                    'body' => [
                        'query' => [
                            'match' => [
                                'goods_name' => $keywords
                            ]
                        ],
                        'highlight' => [
                            'pre_tags' => ["<span style='color: red'>"],
                            'post_tags' => ["</span>"],
                            'fields' => [
                                "goods_name" => new \stdClass()
                            ]
                        ]
                    ]
                ];
                //每页显示条数
                $params["size"] = $size;
                //偏移量
                $params["from"] = $limit;
                //执行搜索
                $results = $client->search($params);
                //循环处理数据,将高亮显示的goods_name替换原数据
                foreach ($results['hits']['hits'] as $k => $v){
                    $results['hits']['hits'][$k]['_source']['goods_name'] = $v['highlight']['goods_name'][0];
                }
                //从二维数组中取出一列
                $list = array_column($results['hits']['hits'], '_source');
                $arr['current_page'] = $page;//当前页
                $last_page = ceil($results['hits']['total']['value']/$size);//总页数
                $arr['last_page'] = $last_page;
                $arr['prev_page'] = $page -1 <= 1 ? 1 : $page - 1;//上一页
                $arr['next_page'] = $page +1 >= $last_page ? $last_page : $page+1;//下一页
                $arr['data'] = $list;//展示的数据
                $cate_name = $keywords;
                //返回页面
                return view('index', ['list' => $arr, 'cate_name' => $cate_name]);

3、前端分页实现(使用内置循环标签{for}{/for})

<div class="fr page">
    <div class="sui-pagination pagination-large">
        <a href=" ?page=1&keywords={$Request.get.keywords}">首页</a>
        <a href=" ?page={$list.prev_page}&keywords={$Request.get.keywords}">上一页</a>
        {for start="1" end="$list.last_page+1"}
        <a href=" ?page={$i}&keywords={$Request.get.keywords}">第{$i}页</a>
        {/for}
        <a href=" ?page={$list.next_page}&keywords={$Request.get.keywords}">下一页</a>
        <a href=" ?page={$list.last_page}&keywords={$Request.get.keywords}">尾页</a>
    </div>
</div>

4、效果图

(检索条件为空)

(检索条件不为空)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值