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

Laravel使用scout集成elasticsearch做全文搜索的实现方法,具体如下:

安装需要的组件

  composer require tamayo/laravel-scout-elastic  composer require laravel/scout

如果composer require laravel/scout 出现报错

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

那么使用命令

  composer require laravel/scout ^5.0

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

  'providers' => [       //es search 加上以下内容       LaravelScoutScoutServiceProvider::class,       ScoutEnginesElasticsearchElasticsearchProvider::class,   ]

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

  php artisan vendor:publish --provider="LaravelScoutScoutServiceProvider"

修改config/scout.php

    'driver' => env('SCOUT_DRIVER', 'elasticsearch'),      'elasticsearch' => [      'index' => env('ELASTICSEARCH_INDEX', '你的Index名字'),      'hosts' => [        env('ELASTICSEARCH_HOST', ''),      ],    ],

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

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

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

  <?php  namespace AppConsoleCommands;  use GuzzleHttpClient;  use IlluminateConsoleCommand;    class ESInit extends Command {      protected $signature = 'es:init';      protected $description = 'init laravel es for news';      public function __construct() { parent::__construct(); }      public function handle() { //创建template      $client = new Client(['auth'=>['elastic', 'Wangcai5388']]);      $url = config('scout.elasticsearch.hosts')[0] . '/_template/news';      $params = [        'json' => [          'template' => config('scout.elasticsearch.index'),          'settings' => [            'number_of_shards' => 5          ],          'mappings' => [            '_default_' => [              'dynamic_templates' => [                [                  'strings' => [                    'match_mapping_type' => 'string',                    'mapping' => [                      'type' => 'text',                      'analyzer' => 'ik_smart',                      'ignore_above' => 256,                      'fields' => [                        'keyword' => [                          'type' => 'keyword'                        ]                      ]                    ]                  ]                ]              ]            ]          ]        ]      ];      $client->put($url, $params);        // 创建index      $url = config('scout.elasticsearch.hosts')[0] . '/' . config('scout.elasticsearch.index');        $params = [        'json' => [          'settings' => [            'refresh_interval' => '5s',            'number_of_shards' => 5,            'number_of_replicas' => 0          ],          'mappings' => [            '_default_' => [              '_all' => [                'enabled' => false              ]            ]          ]        ]      ];      $client->put($url, $params);      }  }

在kernel中注册这个命令

  <?php    namespace AppConsole;    use AppConsoleCommandsESInit;  use IlluminateConsoleSchedulingSchedule;  use IlluminateFoundationConsoleKernel as ConsoleKernel;    class Kernel extends ConsoleKernel  {    /**     * The Artisan commands provided by your application.     *     * @var array     */    protected $commands = [      ESInit::class    ];

执行这个命令 生成 mapping

  php artisan es:init

修改model支持 全文搜索

  <?php  namespace AppActivityNewsModel;    use AppModelCategory;  use AppStarModelStar;  use IlluminateDatabaseEloquentModel;  use LaravelScoutSearchable;      class ActivityNews extends Model  {    use Searchable;      protected $table = 'activity_news';    protected $fillable = [      'type_id',      'category_id',      'title',      'sub_title',      'thumb',      'intro',      'star_id',      'start_at',      'end_at',      'content',      'video_url',      'status',      'is_open',      'is_top',      'rank',    ];      public function star()    {      return $this->hasOne(Star::class, 'id', 'star_id');    }      public function category()    {      return $this->hasOne(Category::class, 'id', 'category_id');    }      public static function getActivityIdByName($name)    {      return self::select('id')        ->where([          ['status', '=', 1],          ['type_id', '=', 2],          ['title', 'like', '%' . $name . '%']        ])->get()->pluck('id');    }    }

导入全文索引信息

  php artisan scout:import "AppActivityNewsModelActivityNews"

测试简单的全文索引

  php artisan tinker    >>> AppActivityNewsModelActivityNews::search('略懂皮毛')->get();
© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论