laravel8 elasticsearch 配置搭建使用

laravel 8框架  扩展elasticsearch 

 

首先 elasticsearch 的版本号 需要和 扩展的版本号对应

composer require elasticsearch/elasticsearch

 

然后是配置到common 调用文件

<?php
namespace App\Es;

use Elasticsearch\ClientBuilder;

class MyEs
{
    //ES客户端链接
    private $client;

    /**
     * 构造函数
     * MyElasticsearch constructor.
     */
    public function __construct()
    {
          // 带有账号、密码的客服端信息           $hosts = [               [                   'host' => '127.0.0.1',      // 域名                   'port' => '9200',           // 端口                   'scheme' => 'http',         // 协议                   'user' => 'elastic',        // 账号                   'pass' => '123456'         // 密码               ]           ];
          $this->client = ClientBuilder::create()->setHosts($hosts)->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
     */publicfunction 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;}}

 

在 其他文件中调用

 

use App\Service\Common\ElasticSearchService;

    public function elastic(){
        $keywords = $this->request->get('keywords');

        $body =  [
            'size'   => 20,
            'from'   => 0,
            'query' => [
                'match' => [
                    'title' => '衣服'
                ]
            ],
            'sort' => ['_score'=>['order'=>'desc']],
        ];

        $res = resolve(ElasticSearchService::class)->search_doc('fulan','goods', $body);

        return $res;
    }

https://www.icode9.com/content-4-1380857.html
https://learnku.com/articles/10126/the-configuration-and-use-of-elasticsearch-for-full-text-search
<?php
namespace App\Es;

use Elasticsearch\ClientBuilder;

class Elasticsearch
{
    private static $obj = '';
    /**
     * 创建索引
     * @param $index
     * @param $param
     * @return array
     */
    public function createESIndex($index, $param)
    {
        $client = $this->getClient();

        $params = [
            'index' => $index,
            'body' => [
                'mappings' => [
                    $index => [
                        'properties' => $param
                    ]
                ]
            ]
        ];

        $response = $client->indices()->create($params);
        return $response;
    }

    /**
     * 删除索引
     * @param $index
     * @return array
     */
    public function deleteESIndex($index)
    {
        $client = $this->getClient();

        $params = ['index' => $index];
        $response = $client->indices()->delete($params);

        return $response;
    }

    /**
     * 索引文档
     * @param $index
     * @param $id
     * @param $param
     * @return array
     */
    public function createDocument($index, $param)
    {
        $client = $this->getClient();

        $params = [
            'index' => $index,
            'type' => $index,
            'body' => $param
        ];

        $response = $client->index($params);
        return $response;
    }

    /**
     * 更新文档
     * @param $index
     * @param $id
     * @param $param
     * @return array
     */
    public function updateDocument($index, $id, $param)
    {
        $client = $this->getClient();

        $params = [
            'index' => $index,
            'type' => $index,
            'id' => $id,
            'body' => [
                'doc' => $param
            ]
        ];

        $response = $client->update($params);
        return $response;
    }

    /**
     * 删除索引
     * @param $index
     * @param $id
     * @return array
     */
    public function deleteDocument($index, $id)
    {
        $client = $this->getClient();

        $params = [
            'index' => $index,
            'type' => $index,
            'id' => $id
        ];

        $response = $client->delete($params);
        return $response;
    }

    /**
     * es查询
     * @param $index
     * @param $param
     * @return array
     */
    public function search($index, $param)
    {
        $client = $this->getClient();

        $params = [
            'index' => $index,
            'type' => $index,
            'body' => $param
        ];

        return $client->search($params);
    }

    /**
     * 创建es 客户端
     * @return \Elasticsearch\Client
     */
    private function getClient()
    {
        if (self::$obj != '') {
            return self::$obj;
        }
        $hosts = explode(',', env('ES_HOST'));
        self::$obj = ClientBuilder::create()->setHosts($hosts)->setBasicAuthentication(env('ES_USER'), env('ES_PASSWORD'))->build();
        return self::$obj;

    }

    /**
     * 判断index 是否存在
     * @author maxubin
     * @param $index
     * @return bool
     */
    public function indexExists($index)
    {
        $client = $this->getClient();
        return $client->indices()->exists([
            'index' => $index
        ]);
    }

    /**
     * 判断文档是否存在
     * @author maxubin
     * @param $index
     * @param $type
     * @return bool
     */
    public function documentExists($index, $type)
    {
        $client = $this->getClient();
        return $client->indices()->existsType([
            'index' => $index,
            'type' => $type
        ]);
    }

}

  



posted @ 2022-10-17 14:21  星云惊蛰  阅读(84)  评论(0)    收藏  举报