在Lumen中使用Elasticsearch

1. 安装第三方包

  • 包名:fadion/bouncy

  • 地址: https://packagist.org/packages/fadion/bouncy

  • lumen的项目的composer.json文件中的"require"配置项中添加fadion/bouncy引用

  • "fadion/bouncy": "dev-l5"

"require": {
        "php": ">=7.1.3",
        "fzaninotto/faker": "^1.8",
        "illuminate/redis": "v5.7.*",
        "laravel/lumen-framework": "5.7.*",
        "laravel/tinker": "^1.0",
        "predis/predis": "^1.1",
        "vlucas/phpdotenv": "~2.2",
        "fadion/bouncy": "dev-l5"
    },
  • 运行 composer update "fadion/bouncy"下载安装依赖

2. 在项目中的配置

  • 在项目/bootstrap/app.php文件中注册

$app->register(Fadion\Bouncy\BouncyServiceProvider::class);

  • 注意\App\Providers\AppServiceProvider必须在\Fadion\Bouncy\BouncyServiceProvider之前被注册。

      $app->register(App\Providers\AppServiceProvider::class);
      $app->register(Fadion\Bouncy\BouncyServiceProvider::class);
    
    
  • 在项目根目录下创建config目录

  • /vendor/fadion/bouncy/src/config目录下的config.php文件改名为bouncy.php

  • bouncy.php(改名后)和elasticsearch.hpp这两个文件copy到在根目录下创建好的config目录下

  • 打开/config/elasticsearch.php文件,编辑文件中的hosts配置项
    注意:如果你的elasticsearch服务配置有账号密码,而且一般都会有,这种情况下elasticsearch的hosts配置非常特殊,必须使用如下格式
    用户名:密码@服务器地址:端口号 这种格式形式
    http://user:password@URL:port

'hosts' => [
        //http://user:password@URL:port
        'http://account:[email protected]:9200'
    ]
  • 打开/vendor/fadion/bouncy/src/Fadion/Bouncy/BouncyServiceProvider.php文件

添加加载配置文件路径函数:

public function config_path()
    {
        return app()->basePath('config');
    }
  • 将上述文件中boot方法中的$this->publishes中调用方法改为使用上述创建的方法:
public function boot()
    {
        $this->publishes(array(
            $this->config_path('bouncy.php'),
            $this->config_path('elasticsearch.php')
        ));
    }
  • \app\Providers\AppServiceProvider.php文件中添加如下方法:
    添加完成后需要在该文件的register方法中调用
public function register()
    {
        $this->loadConfigFile();
    }
    
    protected function loadConfigFile(){
        $this->app->configure('elasticsearch');
    }

3. 项目中使用

  • 在将要进行索引搜索的 Model 文件里,添加 BouncyTrait 的使用

  • 添加指定函数 documentFields ,设定要搜索出来的字段。添加BouncyTrait的使用:

namespace App\Model;
use Fadion\Bouncy\BouncyTrait;
use Illuminate\Database\Eloquent\Model;

class Goods extends Model
{
    //添加es的插件使用
    use BouncyTrait;
  
    //定义es的index
    protected $indexName = 'shop_server_index';
    //定义es的type
    protected $typeName = 'shop_server_type';

    /**
     * 与模型关联的表名
     *
     * @var string
     */
    protected $table = 'ss_goods';

    /**
     * 表的主键名称
     *
     * @var integer
     */
    protected $primaryKey = 'goods_id';

    /**
     * 指示模型是否自动维护时间戳
     *
     * @var bool
     */
    public $timestamps = false;
  
    //定义es需要搜索出来的字段
    public function documentFields()
    {
        return [
            'goods_id'=>$this->goods_id,
            'goods_name'=>$this->goods_name,
            'cate_id'=>$this->cate_id,
            'cate_name'=>$this->cate_name,
            'goods_price'=>$this->goods_price,
            'submit_time'=>$this->submit_time
        ];
    }
}
  • 在项目controller中编写测试方法,进行实际测试
public function es()
    {
        $r = $this->goods::find(1)->index();
        return response($r);
    }
  • 通过接口调用请求:
image-20200407163110937.png

4. 总结

  • 结论:配置成功,应用成功

  • elasticsearchlumen框架在项目应用层面的结合完毕

  • 后续的研究方向是更多的关于elasticsearch本身的东西,与lumen框架关系不大了

  • 接下来,重点研究 elasticsearch官方文档

你可能感兴趣的:(在Lumen中使用Elasticsearch)