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


Posted in PHP onNovember 30, 2018

本文介绍了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 加上以下内容 
    Laravel\Scout\ScoutServiceProvider::class, 
    ScoutEngines\Elasticsearch\ElasticsearchProvider::class, 
]

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

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

修改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 App\Console\Commands;
use GuzzleHttp\Client;
use Illuminate\Console\Command;

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 App\Console;

use App\Console\Commands\ESInit;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel 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 App\ActivityNews\Model;

use App\Model\Category;
use App\Star\Model\Star;
use Illuminate\Database\Eloquent\Model;
use Laravel\Scout\Searchable;


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 "App\ActivityNews\Model\ActivityNews"

测试简单的全文索引

php artisan tinker

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 PHP
PHP array_flip() 删除重复数组元素专用函数
May 16 PHP
PHP常用开发函数解析之数组篇[未完结]
Jul 30 PHP
Mysql中分页查询的两个解决方法比较
May 02 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十)
Jun 24 PHP
PHP中soap的用法实例
Oct 24 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
如何在HTML 中嵌入 PHP 代码
May 13 PHP
twig里使用js变量的方法
Feb 05 PHP
php微信公众平台开发(四)回复功能开发
Dec 06 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 #PHP
php实现每日签到功能
Nov 29 #PHP
PHP序列化的四种实现方法与横向对比
Nov 29 #PHP
PHP中如何使用Redis接管文件存储Session详解
Nov 28 #PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 #PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 #PHP
PHP实现小程序批量通知推送
Nov 27 #PHP
You might like
thinkphp 多表 事务详解
2013/06/17 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
详解PHP swoole process的使用方法
2017/08/26 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
用js实现的抽象CSS圆角效果!!
2007/05/03 Javascript
IE中jquery.form中ajax提交没反应解决方法分享
2012/09/11 Javascript
JavaScript 用Node.js写Shell脚本[译]
2012/09/20 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
2015/10/29 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
Node.js使用supervisor进行开发中调试的方法
2019/03/26 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
12步教你理解Python装饰器
2016/02/25 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
详解Python 函数参数的拆解
2020/09/02 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
python基于opencv 实现图像时钟
2021/01/04 Python
Java软件工程师综合面试题笔试题
2013/09/08 面试题
教师自查自纠工作情况报告
2014/10/29 职场文书
2015年元旦晚会活动总结(学生会)
2014/11/28 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android