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

 

posted @ 2022-03-15 21:55  王越666  阅读(435)  评论(0编辑  收藏  举报