当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel使用scout集成elasticsearch做全文搜索的实现方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-02 09:46:30 浏览: 评论:0 

这篇文章主要介绍了Laravel使用scout集成elasticsearch做全文搜索的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧。

本文介绍了Laravel使用scout集成elasticsearch做全文搜索的实现方法,分享给大家,具体如下:

安装需要的组件

composer require tamayo/laravel-scout-elastic

composer require laravel/scout

如果composer require laravel/scout 出现报错

  1. Using version ^6.1 for laravel/scout 
  2. ./composer.json has been updated 
  3. Loading composer repositories with package information 
  4. Updating dependencies (including require-dev) 
  5. Your requirements could not be resolved to an installable set of packages. 
  6.  
  7.  Problem 1 
  8.   - tamayo/laravel-scout-elastic 4.0.0 requires laravel/scout ^5.0 -> satisfiable by laravel/scout[5.0.x-dev]. 
  9.   - tamayo/laravel-scout-elastic 4.0.0 requires laravel/scout ^5.0 -> satisfiable by laravel/scout[5.0.x-dev]. 
  10.   - tamayo/laravel-scout-elastic 4.0.0 requires laravel/scout ^5.0 -> satisfiable by laravel/scout[5.0.x-dev]. 
  11.   - Conclusion: don't install laravel/scout 5.0.x-dev 
  12.   - Installation request for tamayo/laravel-scout-elastic ^4.0 -> satisfiable by tamayo/laravel-scout-elastic[4.0.0]. 
  13.  
  14.  
  15. Installation failed, reverting ./composer.json to its original content. 

那么使用命令

composer require laravel/scout ^5.0

修改一下配置文件(config/app.php),添加如下两个provider

  1. 'providers' => [  
  2.     //es search 加上以下内容  
  3.     Laravel\Scout\ScoutServiceProvider::class,  
  4.     ScoutEngines\Elasticsearch\ElasticsearchProvider::class,  

添加完成,执行命令,生成config文件

php artisan vendor:publish --provider="Laravel\Scout\ScoutServiceProvider"

修改config/scout.php

  1. 'driver' => env('SCOUT_DRIVER''elasticsearch'), 
  2.  
  3. 'elasticsearch' => [ 
  4.   'index' => env('ELASTICSEARCH_INDEX''你的Index名字'), 
  5.   'hosts' => [ 
  6.     env('ELASTICSEARCH_HOST'''), 
  7.   ], 
  8. ], 

在.env 配置ES的 账号:密码@连接

ELASTICSEARCH_HOST=elastic:密码@你的域名.com:9200

创建一个生成mapping的命令行文件,到 app/Console/Commands

  1. <?php 
  2. namespace App\Console\Commands; 
  3. use GuzzleHttp\Client; 
  4. use Illuminate\Console\Command; 
  5.  
  6. class ESInit extends Command { 
  7.  
  8.   protected $signature = 'es:init'
  9.  
  10.   protected $description = 'init laravel es for news'
  11.  
  12.   public function __construct() { parent::__construct(); } 
  13.  
  14.   public function handle() { //创建template 
  15.     $client = new Client(['auth'=>['elastic''Wangcai5388']]); 
  16.     $url = config('scout.elasticsearch.hosts')[0] . '/_template/news'
  17.     $params = [ 
  18.       'json' => [ 
  19.         'template' => config('scout.elasticsearch.index'), 
  20.         'settings' => [ 
  21.           'number_of_shards' => 5 
  22.         ], 
  23.         'mappings' => [ 
  24.           '_default_' => [ 
  25.             'dynamic_templates' => [ 
  26.               [ 
  27.                 'strings' => [ 
  28.                   'match_mapping_type' => 'string'
  29.                   'mapping' => [ 
  30.                     'type' => 'text'
  31.                     'analyzer' => 'ik_smart'
  32.                     'ignore_above' => 256, 
  33.                     'fields' => [ 
  34.                       'keyword' => [ 
  35.                         'type' => 'keyword' 
  36.                       ] 
  37.                     ] 
  38.                   ] 
  39.                 ] 
  40.               ] 
  41.             ] 
  42.           ] 
  43.         ] 
  44.       ] 
  45.     ]; 
  46.     $client->put($url$params); 
  47.  
  48.     // 创建index 
  49.     $url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index'); 
  50.  
  51.     $params = [ 
  52.       'json' => [ 
  53.         'settings' => [ 
  54.           'refresh_interval' => '5s'
  55.           'number_of_shards' => 5, 
  56.           'number_of_replicas' => 0 
  57.         ], 
  58.         'mappings' => [ 
  59.           '_default_' => [ 
  60.             '_all' => [ 
  61.               'enabled' => false 
  62.             ] 
  63.           ] 
  64.         ] 
  65.       ] 
  66.     ]; 
  67.     $client->put($url$params); 
  68.  
  69.   } 

在kernel中注册这个命令

  1. <?php 
  2.  
  3. namespace App\Console; 
  4.  
  5. use App\Console\Commands\ESInit; 
  6. use Illuminate\Console\Scheduling\Schedule; 
  7. use Illuminate\Foundation\Console\Kernel as ConsoleKernel; 
  8.  
  9. class Kernel extends ConsoleKernel 
  10.   /** 
  11.    * The Artisan commands provided by your application. 
  12.    * 
  13.    * @var array 
  14.    */ 
  15.   protected $commands = [ 
  16.     ESInit::class 
  17.   ]; 

执行这个命令 生成 mapping

php artisan es:init

修改model支持 全文搜索

  1. <?php 
  2. namespace App\ActivityNews\Model; 
  3.  
  4. use App\Model\Category; 
  5. use App\Star\Model\Star; 
  6. use Illuminate\Database\Eloquent\Model; 
  7. use Laravel\Scout\Searchable; 
  8.  
  9.  
  10. class ActivityNews extends Model 
  11.   use Searchable; 
  12.  
  13.   protected $table = 'activity_news'
  14.   protected $fillable = [ 
  15.     'type_id'
  16.     'category_id'
  17.     'title'
  18.     'sub_title'
  19.     'thumb'
  20.     'intro'
  21.     'star_id'
  22.     'start_at'
  23.     'end_at'
  24.     'content'
  25.     'video_url'
  26.     'status'
  27.     'is_open'
  28.     'is_top'
  29.     'rank'
  30.   ]; 
  31.  
  32.   public function star() 
  33.   { 
  34.     return $this->hasOne(Star::class'id''star_id'); 
  35.   } 
  36.  
  37.   public function category() 
  38.   { 
  39.     return $this->hasOne(Category::class'id''category_id'); 
  40.   } 
  41.  
  42.   public static function getActivityIdByName($name
  43.   { 
  44.     return self::select('id'
  45.       ->where([ 
  46.         ['status''=', 1], 
  47.         ['type_id''=', 2], 
  48.         ['title''like''%' . $name . '%'
  49.       ])->get()->pluck('id'); 
  50.   } 
  51.  

导入全文索引信息

php artisan scout:import "App\ActivityNews\Model\ActivityNews"

测试简单的全文索引

php artisan tinker

>>> App\ActivityNews\Model\ActivityNews::search('略懂皮毛')->get();

Tags: Laravel scout elasticsearch

分享到: