教你在laravel中如何使用elaticsearch(步骤分明)

 2729

下面给大家介绍在laravel中如何使用elaticsearch(步骤分明),希望对大家有所帮助!


安装相关扩展包

guzzlehttp/guzzle

elasticsearch/elasticsearch

laravel/scout

babenkoivan/scout-elasticsearch-driver

predis/predis 数据量大需要使用队列同步、拉取数据时安装


1、安装 guzzlehttp/guzzle

composer require guzzlehttp/guzzle

在 app/Services 目录下编写 Http 服务类

<?php
 
namespace App\Services;
use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;
class HttpService
{
 
    protected $client;
 
    public function __construct()
    {
        $this->client = new Client(['verify' => false, 'timeout' => 0,]);
    }
 
    /**
     * 发送 get 请求
     * @param $url
     * @param array $aQueryParam
     * @param string $isDecode
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function get($url, $aQueryParam = [], $isDecode = true)
    {
        $response = $this->client->request('GET',
            $url,
            [
                'query' => $aQueryParam            ]);
        if($isDecode){
            return \GuzzleHttp\json_decode($response->getbody()->getContents(), true);
        }
        return $response->getbody()->getContents();
    }
 
    /**
     *  发送 post 请求
     * @param $url
     * @param array $aParam
     * @param string $type
     * @param string $isDecode
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function post($url, $aParam = [], $type = 'form_params', $isDecode = true)
    {
        $aOptions = [];
        // Sending application/x-www-form-urlencoded POST
        if ($type == 'form_params') {
            $aOptions['form_params'] = $aParam;
        }
        //  upload JSON data
        if ($type == 'json') {
            $aOptions['json'] = $aParam;
        }
        $response = $this->client->request('POST', $url, $aOptions);
 
        if($isDecode){
            return \GuzzleHttp\json_decode($response->getbody()->getContents(), true);
        }
        return $response->getbody()->getContents();
    }
 
    /**
     *  发送 put 请求
     * @param $url
     * @param array $aParam
     * @param string $type
     * @param string $isDecode
     * @return mixed
     * @throws \GuzzleHttp\Exception\GuzzleException
     */
    public function put($url, $aParam = [], $type = 'form_params', $isDecode = true)
    {
        $aOptions = [];
        // Sending application/x-www-form-urlencoded POST
        if ($type == 'form_params') {
            $aOptions['form_params'] = $aParam;
        }
        //  upload JSON data
        if ($type == 'json') {
            $aOptions['json'] = $aParam;
        }
        $response = $this->client->request('PUT', $url, $aOptions);
 
        if($isDecode){
            return \GuzzleHttp\json_decode($response->getbody()->getContents(), true);
        }
        return $response->getbody()->getContents();
    }
 
    /**
     * 保存远程文件到本地
     * 跟随第三方服务器url重定向
     * @param $url
     * @return bool|string
     */
    public function getRemoteFile($url)
    {
        $jar = new CookieJar();
        $aOptions = ['cookies' => $jar];
        $response = $this->client->request('GET', $url, $aOptions);
        return $response->getBody()->getContents();
    }
}


2、安装 elasticsearch/elasticsearch

composer require elasticsearch/elasticsearch


3、安装 laravel/scout

composer require laravel/scout 
php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"


4、安装 scout 第三方驱动 babenkoivan/scout-elasticsearch-driver

composer require babenkoivan/scout-elasticsearch-driver 
php artisan vendor:publish --provider="ScoutElastic\ScoutElasticServiceProvider"

scout 服务配置,在 env 中增加配置项

// 驱动的host,若需账密:http://es_username:password@127.0.0.1:9200SCOUT_ELASTIC_HOST=elasticsearch:9200
// 驱动SCOUT_DRIVER=elastic
// 队列配置,数据量大时建议开启SCOUT_QUEUE=true


5、安装 predis/predis

composer require predis/predis


初始化 elatic Template

这里以 artisan 命令的方式配置 生成命令文件

php artisan make:command EsInit
<?php
namespace App\Console\Commands;
use App\Services\HttpService;
use Illuminate\Console\Command;
class EsInit extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'es:init';
 
    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'init laravel es for article';
 
    /**
     * Create a new command instance.
     *
     * @return void
     */
    protected  $http;
    public function __construct()
    {
        parent::__construct();
        parent::__construct();
        $this->http = new HttpService();
    }
 
    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->createTemplate();
    }
    protected function createTemplate()
    {
        $aData = [
            /*
             * 这句是取在scout.php(scout是驱动)里我们配置好elasticsearch引擎的index项。
             * PS:其实都是取数组项,scout本身就是return一个数组,
             * scout.elasticsearch.index就是取
             * scout[elasticsearch][index]
             **/
            'template'=>config('scout.elasticsearch.index'),
            'mappings'=>[
                'articles' => [
                    'properties' => [
                        'title' => [
                            'type' => 'text'
                        ],
                        'content' => [
                            'type' => 'text'
                        ],
                        'created_at' => [
                            'format' => 'yy-MM-dd HHss',
                            'type' => 'date'
                        ],
                        'updated_at' => [
                            'format' => 'yy-MM-dd HHss',
                            'type' => 'date'
                        ]
                    ]
                ]
            ],
        ];
        $url = config('scout.elasticsearch.hosts')[0] . '/' . '_template/rtf';
        $this->http->put($url,$aData,'json');
    }
}

生成检索 model

php artisan make:model Models/Article


创建 model 索引配置文件

Elasticsearch\ArticleIndexConfigurator.php

<?php
namespace App\Elasticsearch;
use ScoutElastic\IndexConfigurator;
use ScoutElastic\Migratable;
class ArticleIndexConfigurator extends IndexConfigurator
{
    use Migratable;
    protected $name = 'articles';
    /**
     * @var array
     */
    protected $settings = [
        'analysis' => [
            'analyzer' => [
                'es_std' => [
                    'type' => 'standard',
                    'stopwords' => '_spanish_'
                ]
            ]
        ]
    ];
}


创建 model 检索规则文件

Elasticsearch\SearchRules\ArticleRule.php

<?php
namespace App\Elasticsearch\SearchRules;
use ScoutElastic\SearchRule;
class ArticleRule extends SearchRule
{
    /*
     * @inheritdoc
     */
    public function buildHighlightPayload()
    {
        return [
            'fields' => [
                'title' => [
                    'type' => 'unified',
                ],
                'content' => [
                    'type' => 'unified',
                ],
            ]
        ];
    }
 
    //进行 match 搜索,会分词
    public function buildQueryPayload()
    {
        $query = $this->builder->query;
        return [
            'must' => [
                'query_string' => [
                    'query' => $query,
                ],
            ],
        ];
    }
}


设置 model Mapping 及检索字段

class Article extends Model{
    protected $indexConfigurator = ArticleIndexConfigurator::class;
    use Searchable;
 
    /**
     * 检索规则
     * @var string[]
     */
    protected $searchRules = [
        ArticleRule::class
    ];
 
    // 设置模型字段的映射关系
    protected $mapping = [
        'properties' => [
            'id' => [
                'type' => 'integer',
            ],
            'title' => [
                'type' => 'text',
                'analyzer' => 'ik_max_word',
                'search_analyzer' => 'ik_max_word',
                'index_options' => 'offsets',
                'store' => true
            ],
            'content' => [
                'type' => 'text',
                'analyzer' => 'ik_max_word',
                'search_analyzer' => 'ik_max_word',
                'index_options' => 'offsets',
                'store' => true
            ],
            'number' => [
                'type' => 'integer',
            ],
        ],
    ];
 
    /**
     * 设置 es 检索返回的字段
     * [@return](https://learnku.com/users/31554) array
     */
    public function toSearchableArray() {
        return [
            'id' => $this->id,
            'title' => $this->title,
            'content' => $this->content,
        ];
    }
}


使用步骤

生成 elatic Template 类似 mysql 表结构

php artisan es:init

更新 elatic 类型映射

php artisan elastic:update-mapping "App\Models\Article"

数据库数据导入 elatic

php artisan scout:import "App\Models\Article"


PS: 其他命令

清空 elatic 数据

php artisan scout:flush "App\Models\Article"

使用检索

$query = Article::search('二胡')
        ->paginateRaw(3,'article',1);
dd($query->items()['hits']);

其他使用请自行查看文档


本文网址:https://www.zztuku.com/detail-9630.html
站长图库 - 教你在laravel中如何使用elaticsearch(步骤分明)
申明:如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐