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

广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买

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

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

【相关推荐:laravel视频教程】

composer 安装

composer require elasticsearch/elasticsearch
登录后复制

ES 封装

<?phpnamespace 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封装及其使用方法的详细内容,更多请关注9543建站博客其它相关文章!

广告:SSL证书一年128.66元起,点击购买~~~

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。

作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:php7 yum安装redis的方法
下一篇:PHP函数手册解析:array_walk_recursive()

发表评论

关闭广告
关闭广告