环球热点评!详解Laravel8 ES封装及其使用方法

时间:2022-11-23 17:02:18       来源:转载
本篇文章给大家介绍有关Laravel8的相关知识,内容包括讲解Laravel8 ES封装以及使用方法,希望对大家有所帮助!

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


(资料图)

composer 安装

composer require elasticsearch/elasticsearch
登录后复制

ES 封装

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"=>[                                ""                            ],                            "post_tags"=>[                                ""                            ]                        ]                    ]                ]            ];     * @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"=>[                                ""                            ],                            "post_tags"=>[                                ""                            ]                        ]                    ]                ]            ];            $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 封装类的搜索方法中增加两个形参

搜索后搜索值高亮显示

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

登录后复制

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

关键词: 使用方法 逻辑方法 相关文章