教你在laravel中如何使用elaticsearch(步骤分明)
2871
下面给大家介绍在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/index.php/detail-9630.html
站长图库 - 教你在laravel中如何使用elaticsearch(步骤分明)
申明:如有侵犯,请 联系我们 删除。
您还没有登录,请 登录 后发表评论!
提示:请勿发布广告垃圾评论,否则封号处理!!