教你在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 分享