• 技术文章 >php框架 >Laravel

    详解Laravel8 ES封装及其使用方法

    藏色散人藏色散人2022-11-23 17:03:55转载587

    本篇文章给大家介绍有关Laravel8的相关知识,内容包括讲解Laravel8 ES封装以及使用方法,希望对大家有所帮助!

    【相关推荐:laravel视频教程

    composer 安装

    composer require elasticsearch/elasticsearch

    ES 封装

    <?php
    namespace App\Es;
    use Elasticsearch\ClientBuilder;
    class MyEs
    {
        //ES客户端链接
        private $client;
        /**
         * 构造函数
         * MyElasticsearch constructor.
         */
        public function __construct()
        {
            $this->client = ClientBuilder::create()->setHosts(['127.0.0.1:9200'])->build();
        }
        /**
         * 判断索引是否存在
         * @param string $index_name
         * @return bool|mixed|string
         */
        public function exists_index($index_name = 'test_ik')
        {
            $params = [
                'index' => $index_name
            ];
            try {
                return $this->client->indices()->exists($params);
            } catch (\Elasticsearch\Common\Exceptions\BadRequest400Exception $e) {
                $msg = $e->getMessage();
                $msg = json_decode($msg,true);
                return $msg;
            }
        }
        /**
         * 创建索引
         * @param string $index_name
         * @return array|mixed|string
         */
        public function create_index($index_name = 'test_ik') { // 只能创建一次
            $params = [
                'index' => $index_name,
                'body' => [
                    'settings' => [
                        'number_of_shards' => 5,
                        'number_of_replicas' => 1
                    ]
                ]
            ];
            try {
                return $this->client->indices()->create($params);
            } catch (\Elasticsearch\Common\Exceptions\BadRequest400Exception $e) {
                $msg = $e->getMessage();
                $msg = json_decode($msg,true);
                return $msg;
            }
        }
        /**
         * 删除索引
         * @param string $index_name
         * @return array
         */
        public function delete_index($index_name = 'test_ik') {
            $params = ['index' => $index_name];
            $response = $this->client->indices()->delete($params);
            return $response;
        }
        /**
         * 添加文档
         * @param $id
         * @param $doc ['id'=>100, 'title'=>'phone']
         * @param string $index_name
         * @param string $type_name
         * @return array
         */
        public function add_doc($id,$doc,$index_name = 'test_ik',$type_name = 'goods') {
            $params = [
                'index' => $index_name,
                'type' => $type_name,
                'id' => $id,
                'body' => $doc
            ];
            $response = $this->client->index($params);
            return $response;
        }
        /**
         * 判断文档存在
         * @param int $id
         * @param string $index_name
         * @param string $type_name
         * @return array|bool
         */
        public function exists_doc($id = 1,$index_name = 'test_ik',$type_name = 'goods') {
            $params = [
                'index' => $index_name,
                'type' => $type_name,
                'id' => $id
            ];
            $response = $this->client->exists($params);
            return $response;
        }
        /**
         * 获取文档
         * @param int $id
         * @param string $index_name
         * @param string $type_name
         * @return array
         */
        public function get_doc($id = 1,$index_name = 'test_ik',$type_name = 'goods') {
            $params = [
                'index' => $index_name,
                'type' => $type_name,
                'id' => $id
            ];
            $response = $this->client->get($params);
            return $response;
        }
        /**
         * 更新文档
         * @param int $id
         * @param string $index_name
         * @param string $type_name
         * @param array $body ['doc' => ['title' => '苹果手机iPhoneX']]
         * @return array
         */
        public function update_doc($id = 1,$index_name = 'test_ik',$type_name = 'goods', $body=[]) {
            // 可以灵活添加新字段,最好不要乱添加
            $params = [
                'index' => $index_name,
                'type' => $type_name,
                'id' => $id,
                'body' => $body
            ];
            $response = $this->client->update($params);
            return $response;
        }
        /**
         * 删除文档
         * @param int $id
         * @param string $index_name
         * @param string $type_name
         * @return array
         */
        public function delete_doc($id = 1,$index_name = 'test_ik',$type_name = 'goods') {
            $params = [
                'index' => $index_name,
                'type' => $type_name,
                'id' => $id
            ];
            $response = $this->client->delete($params);
            return $response;
        }
        /**
         * 搜索文档 (分页,排序,权重,过滤)
         * @param string $index_name
         * @param string $type_name
         * @param array $body
         * $body = [
                    'query' => [
                        'match' => [
                            'fang_name' => [
                                'query' => $fangName
                            ]
                        ]
                    ],
                    'highlight'=>[
                        'fields'=>[
                            'fang_name'=>[
                                'pre_tags'=>[
                                    '<span style="color: red">'
                                ],
                                'post_tags'=>[
                                    '</span>'
                                ]
                            ]
                        ]
                    ]
                ];
         * @return array
         */
        public function search_doc($index_name = "test_ik",$type_name = "goods",$body=[]) {
            $params = [
                'index' => $index_name,
                'type' => $type_name,
                'body' => $body
            ];
            $results = $this->client->search($params);
            return $results;
        }
    }

    将数据表中所有数据添加至 ES

    public function esAdd()
        {
            $data = Good::get()->toArray();
            $es = new MyEs();
            if (!$es->exists_index('goods')) {
                //创建es索引,es的索引相当于MySQL的数据库
                $es->create_index('goods');
            }
            foreach ($data as $model) {
                $es->add_doc($model['id'], $model, 'goods', '_doc');
            }
        }

    每在 MySQL 里添加一条数据,在 es 里也添加一条

    直接将代码补在 MySQL 添加入库的逻辑方法里即可

            //添加至MySQL
            $res=Good::insertGetId($arr);
            $es = new MyEs();
            if (!$es->exists_index('goods')) {
                $es->create_index('goods');
            }
            //添加至es
            $es->add_doc($res, $arr, 'goods', '_doc');
            return $res;

    进行 MySQL 数据修改时,也更新 es 的数据

    直接将代码补在 MySQL 修改数据的逻辑方法里即可

          //修改MySQL的数据
            $res=Good::where('id',$id)->update($arr);
            $es = new MyEs();
            if (!$es->exists_index('goods')) {
                $es->create_index('goods');
            }
            //修改es的数据
            $es->update_doc($id, 'goods', '_doc',['doc'=>$arr]);
            return $res;

    通过 ES 实现搜索功能

    public function search()
        {
            //获取搜索值
            $search = \request()->get('search');
            if (!empty($search)) {
                $es = new MyEs();
                $body = [
                    'query' => [
                        'match' => [
                            'title' => [
                                'query' => $search
                            ]
                        ]
                    ],
                    'highlight'=>[
                        'fields'=>[
                            'title'=>[
                                'pre_tags'=>[
                                    '<span style="color: red">'
                                ],
                                'post_tags'=>[
                                    '</span>'
                                ]
                            ]
                        ]
                    ]
                ];
                $res = $es->search_doc('goods', '_doc', $body);
                $data = array_column($res['hits']['hits'], '_source');
                foreach ($data as $key=>&$v){
                     $v['title'] = $res['hits']['hits'][$key]['highlight']['title'][0];
                }
                unset($v);
                return $data;
            }
            $data = Good::get();
            return $data;
        }

    另,补充 es 分页搜索

    如果是在微信小程序中使用的话,运用上拉触底事件即可

    此功能是在上面搜索功能之上添加代码实现的

    1. 接收前台小程序传递来的当前页

    2. 调用 es 封装类的搜索方法时,多传两个参数

    3. 在 es 封装类的搜索方法中增加两个形参

    搜索后搜索值高亮显示

    如果是在微信小程序中使用的话,是直接将标签和值一起输出到页面的,加入解析富文本的标签可以将标签转化格式,达到高亮效果

    <rich-text nodes="{{item.title}}"></rich-text>

    原文作者:amateur

    转自链接:https://learnku.com/articles/66177

    以上就是详解Laravel8 ES封装及其使用方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:lavarel
    上一篇:从两方面分析内部服务器间接口通信问题 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • Laravel扩展推荐:vite-plugin包利用 Vite 实现热重载• 6个Laravel Eloquent小技巧,助你提高代码可读性!• 一文了解Laravel中的Pipeline(管道)• 如何提高 Laravel 应用程序的速度• 详解如何在Laravel9.x中快速安装Bootstrap
    1/1

    PHP中文网