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

下面由laravel教程欄目帶大家介紹在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 AppServices;use GuzzleHttpClient;use GuzzleHttpCookieCookieJar;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 GuzzleHttpExceptionGuzzleException      */     public function get($url, $aQueryParam = [], $isDecode = true)     {         $response = $this->client->request('GET',             $url,             [                 'query' => $aQueryParam            ]);         if($isDecode){             return GuzzleHttpjson_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 GuzzleHttpExceptionGuzzleException      */     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 GuzzleHttpjson_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 GuzzleHttpExceptionGuzzleException      */     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 GuzzleHttpjson_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();     }}

2.安裝 elasticsearch/elasticsearch

composer require elasticsearch/elasticsearch

3.安裝 laravel/scout

composer require laravel/scout  php artisan vendor:publish --provider="LaravelScoutScoutServiceProvider"

4.安裝 scout 第三方驅動 babenkoivan/scout-elasticsearch-driver

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

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 AppConsoleCommands;use AppServicesHttpService;use IlluminateConsoleCommand;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');   }}

    生成檢索 model

    php artisan make:model Models/Article

創建 model 索引配置文件

  • ElasticsearchArticleIndexConfigurator.php
    <?php namespace AppElasticsearch;use ScoutElasticIndexConfigurator;use ScoutElasticMigratable;class ArticleIndexConfigurator extends IndexConfigurator{   use Migratable;   protected $name = 'articles';   /**    * @var array    */   protected $settings = [       'analysis' => [           'analyzer' => [               'es_std' => [                   'type' => 'standard',                   'stopwords' => '_spanish_'               ]           ]       ]   ];}

創建 model 檢索規則文件

  • ElasticsearchSearchRulesArticleRule.php

    <?php namespace AppElasticsearchSearchRules;use ScoutElasticSearchRule;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 "AppModelsArticle"
  • 數據庫數據導入 elatic

    php artisan scout:import "AppModelsArticle"
  • PS: 其他命令

  • 清空 elatic 數據

    php artisan scout:flush "AppModelsArticle"

使用檢索

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

其他使用請自行查看文檔

以上就是教你在

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享