elasticsearch curd的封装和使用(laravel)
1:前提条件是下载es,开启es,这里我上一篇文章已经总结过啦,就不过多解释了
https://www.cnblogs.com/xiaoyantongxue/p/15943484.html
laravel 进行安装elasticsearch 组件
composer require elasticsearch/elasticsearch
.在要使用的地方引入ES
use Elasticsearch\ClientBuilder;
2:在 app/http/controllers/service 新建 Elasticsearch .php 直接封装代码
<?php namespace App\Http\Controllers\service; use Elasticsearch\ClientBuilder; class ElasticsearchServier{ //ES客户端链接 private $client; /** * 初始化ES连接 * ES constructor. */ public function __construct($index) { $params = array( '127.0.0.1:9200' ); $this->client = ClientBuilder::create()->setHosts($params)->build(); // 查看是否建立索引,如果没有,则创建 if (!$this->exists_index($index)) { $this->create_index($index); } return $this->client; } /** * 判断索引是否存在 * @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 (\Exception $e) { return false; } } /** * 创建索引 * @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' => 1, 'number_of_replicas' => 1 ] ] ]; try { return $this->client->indices()->create($params); } catch (\Exception $e) { return false; } } /** * 删除索引 * @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 $params * $params = [ * 'index' => "es", * 'type' => "article", * "body" => [ * "title" => "", * ] * ]; * @return array */ public function add_doc($params) { return $this->client->index($params); } /** * 判断文档存在 * @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; } /** * 修改文档 *$params = [ 'index' => "es", 'type' => "article", 'id' => "OIwzxXgBzF70K-DobSSC", "body" => [ "doc" => [ "title" => "6100万颗心的共同记忆 再次C位亮相,闪耀全球!", "desn" => "刚刚过去的这个清明节,与往年一样,有人凭寄哀思,有人缅怀忠魂。但也有一些瞬间,让人记起久久不能释怀,给这个特殊节气增添了一些格外不同的味道。" ] ] ]; * @param array $params * @return array */ public function update_doc($params = []) { $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' => [ * 'bool' => [ * 'should' => [ * [ * 'match' => [ * 'cate_name' => [ * 'query' => $keywords, * 'boost' => 4, // 权重大 * ] * ] * ], * [ * 'match' => [ * 'goods_name' => [ * 'query' => $keywords, * 'boost' => 3, * ] * ] * ], * [ * 'match' => [ * 'goods_introduce' => [ * 'query' => $keywords, * 'boost' => 2, * ] * ] * ] * ], * ], * ], * 'sort' => ['id'=>['order'=>'desc']], * 'from' => $from, * 'size' => $size * ]; * @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; } }
3: App\Http\Controllers\mouth 建一个 ShowDataController控制器进行调用封装的代码
(1)新增索引(表名)
/** * 显示资源列表 */ public function index() { //创建索引 索引名称不能重复 否则报错 $es = new ElasticsearchServier('ElasticsearchServier'); // 你要创建的索引名称 $indexNmae = 'es_test'; $result = $es->create_index($indexNmae); return response()->json(['code' => 200, 'messages' => '索引创建成功', 'data' => $result]); }
走路由
//es 的创建 Route::get('es_index','ShowDataController@index');
(2)添加数据
/** * 添加数据 */ public function create() { // 参数 相当于$request->post(‘title’) $title = '老人与海'; $content = '老人与海的文章内容'; $data = [ 'title' => $title, 'content' => $content ]; try { //添加至数据库中,并将id返回 $id = Title::insertGetId($data); //将数据添加到es中 $es = new ElasticsearchServier('ElasticsearchServier'); $params = [ //索引名 'index' => "title", //相当于数据库 'type' => "es", //id 'id' => $id, "body" => [ "title" => $data['title'], "content" => $data['content'], ] ]; $es->add_doc($params); } catch (Exception $exception) { return response()->json(['code' => 200, 'messages' => '数据添加成功', 'data' => $id]); } return response()->json(['code' => 200, 'messages' => '数据添加成功', 'data' => $id]); }
走路由
// es 添加 Route::get('es_create','ShowDataController@create');
(3)查询一条数据
/** * 查询一条数据 */ public function edit(Request $request) { //要搜索的id值 $id = 3; //$request->get('id'); $es = new ElasticsearchServier('ElasticsearchServier'); //查询数据 $edit = $es->get_doc($id, 'title', 'es'); return response()->json(['code' => 200, 'messages' => '索引创建成功', 'data' => $edit]); }
走路由
// es 详情 Route::get('es_edit','ShowDataController@edit');
(4)搜索
/** * 搜索 */ public function search_doc() { $where = '与海'; $es = new ElasticsearchServier('ElasticsearchServier'); $index_name = "title"; $type_name = "es"; $body = [ 'query' => [ 'bool' => [ 'should' => [ [ 'match' => [ // 搜索的字段名 'title' => [ //搜索的关键字 'query' => $where, 'boost' => 4, // 权重大 ] ], ], [ 'match' => [ 'content' => [ 'query' => $where, 'boost' => 3, // 权重大 ] ], ], ], ] ]]; $response = $es->search_doc($index_name, $type_name, $body); $data = array_column($response, "hits"); $data = array_column($data[0], "_source"); foreach ($data as $key => &$val) { $val['title'] = str_replace($where, "<span style='color: red'>$where</span>", $val['title']); } //可以将数据发送到视图 print_r($data); }
走路由
// es 搜索 Route::get('es_search','ShowDataController@search_doc');
(5)修改
/** *修改 */ // 根据id修改es中的数据 public function update() { $id = 3; //$request->get('id'); $title ='6100万颗心的共同记忆 再次C位亮相,闪耀全球!' ; //$request->get('title'); $content = '刚刚过去的这个清明节,与往年一样,有人凭寄哀思,有人缅怀忠魂。但也有一些瞬间'; //$request->get('id'); $es = new ElasticsearchServier('ElasticsearchServier'); $params = [ 'index' => "title", 'type' => "es", 'id' => $id, "body" => [ "doc" => [ "title" => $title, "content" => $content ] ] ]; $result=$es->update_doc($params); return response()->json(['code' => 200, 'messages' => '数据修改成功', 'data' => $result]); }
走路由
// es 修改 Route::get('es_update','ShowDataController@update');
查看是否搜索成功
(6)查询全部数据
/** *获取文档 查询全部的数据 */ public function selects() { $es = new ElasticsearchServier('ElasticsearchServier'); $data = $es->search_doc('title','es'); return response()->json(['code' => 200, 'messages' => '数据查询', 'data' => $data]); }
走路由,并访问
//es 展示 Route::get('es_select','ShowDataController@selects');
全部代码汇总
<?php namespace App\Http\Controllers\mouth; use App\Http\Controllers\Controller; use App\Http\Controllers\service\ElasticsearchServier; use App\Models\Title; use Illuminate\Support\Facades\Request; class ShowDataController extends Controller { /** * 显示资源列表 */ public function index() { //创建索引 索引名称不能重复 否则报错 $es = new ElasticsearchServier('ElasticsearchServier'); // 你要创建的索引名称 $indexNmae = 'es_test'; $result = $es->create_index($indexNmae); return response()->json(['code' => 200, 'messages' => '索引创建成功', 'data' => $result]); } /** * 添加数据 */ public function create() { // 参数 相当于$request->post(‘title’) $title = '老人与海'; $content = '老人与海的文章内容'; $data = [ 'title' => $title, 'content' => $content ]; try { //添加至数据库中,并将id返回 $id = Title::insertGetId($data); //将数据添加到es中 $es = new ElasticsearchServier('ElasticsearchServier'); $params = [ //索引名 'index' => "title", //相当于数据库 'type' => "es", //id 'id' => $id, "body" => [ "title" => $data['title'], "content" => $data['content'], ] ]; $es->add_doc($params); } catch (Exception $exception) { return response()->json(['code' => 200, 'messages' => '数据添加成功', 'data' => $id]); } return response()->json(['code' => 200, 'messages' => '数据添加成功', 'data' => $id]); } /** * 搜索 */ public function search_doc() { $where = '与海'; $es = new ElasticsearchServier('ElasticsearchServier'); $index_name = "title"; $type_name = "es"; $body = [ 'query' => [ 'bool' => [ 'should' => [ [ 'match' => [ // 搜索的字段名 'title' => [ //搜索的关键字 'query' => $where, 'boost' => 4, // 权重大 ] ], ], [ 'match' => [ 'content' => [ 'query' => $where, 'boost' => 3, // 权重大 ] ], ], ], ] ]]; $response = $es->search_doc($index_name, $type_name, $body); $data = array_column($response, "hits"); $data = array_column($data[0], "_source"); foreach ($data as $key => &$val) { $val['title'] = str_replace($where, "<span style='color: red'>$where</span>", $val['title']); } //可以将数据发送到视图 print_r($data); } /** * 查询一条数据 */ public function edit(Request $request) { //要搜索的id值 $id = 3; //$request->get('id'); $es = new ElasticsearchServier('ElasticsearchServier'); //查询数据 $edit = $es->get_doc($id, 'title', 'es'); return response()->json(['code' => 200, 'messages' => '索引创建成功', 'data' => $edit]); } /** *修改 */ // 根据id修改es中的数据 public function update() { $id = 3; //$request->get('id'); $title ='610000万颗心的共同记忆 再次C位亮相,闪耀全球!' ; //$request->get('title'); $content = '刚刚过去的这个清明节,与往年一样,有人凭寄哀思,有人缅怀忠魂。但也有一些瞬间'; //$request->get('id'); $es = new ElasticsearchServier('ElasticsearchServier'); $params = [ 'index' => "title", 'type' => "es", 'id' => $id, "body" => [ "doc" => [ "title" => $title, "content" => $content ] ] ]; $result=$es->update_doc($params); return response()->json(['code' => 200, 'messages' => '数据修改成功', 'data' => $result]); } }
封装代码链接
https://www.cnblogs.com/cyxng/p/14654354.html
curd代码链接
elasticsearch简单的增删改查与高亮显示
看不懂可以参考这一篇文章
https://blog.csdn.net/weixin_54356942/article/details/122132759?spm=1001.2014.3001.5502
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现