在Lumen中使用Elasticsearch
1. 安装第三方包
-
包名:
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:password@192.168.2.59: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);
}
- 通过接口调用请求:
4. 总结
-
结论:配置成功,应用成功
-
elasticsearch
与lumen
框架在项目应用层面的结合完毕 -
后续的研究方向是更多的关于
elasticsearch
本身的东西,与lumen
框架关系不大了 -
接下来,重点研究 elasticsearch官方文档