您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么在laravel中使用elaticsearch”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么在laravel中使用elaticsearch”吧!
安裝相關擴展包
guzzlehttp/guzzle
elasticsearch/elasticsearch
laravel/scout
babenkoivan/scout-elasticsearch-driver
predis/predis 數據量大需要使用隊列同步、拉取數據時安裝
composer require guzzlehttp/guzzle
<?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](https://learnku.com/users/31554) 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](https://learnku.com/users/31554) 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](https://learnku.com/users/31554) 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](https://learnku.com/users/31554) bool|string */ public function getRemoteFile($url) { $jar = new CookieJar(); $aOptions = ['cookies' => $jar]; $response = $this->client->request('GET', $url, $aOptions); return $response->getBody()->getContents(); }}
composer require elasticsearch/elasticsearch
composer require laravel/scout php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"
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
composer require predis/predis
這里以 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](https://learnku.com/users/31554) void */ protected $http; public function __construct() { parent::__construct(); parent::__construct(); $this->http = new HttpService(); } /** * Execute the console command. * * [@return](https://learnku.com/users/31554) 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'); }}
php artisan make:model Models/Article
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_' ] ] ] ];}
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, ], ], ]; }}
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']);
感謝各位的閱讀,以上就是“怎么在laravel中使用elaticsearch”的內容了,經過本文的學習后,相信大家對怎么在laravel中使用elaticsearch這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。