【相关推荐: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中文网其它相关文章!