为什么推荐
前段时间,由于项目对elasticsearch的使用占比越来越大,写elasticsearch的原生查询感觉太麻烦了,因此有个想法,尝试使用orm的方式,封装一个elasticsearch,经过一段时间的使用,觉得还ok,基本都够用,就把它打包成composer包上传,自己经过尝试,可以适用原生php,也可以适用于laravel、hyperf等主流框架(其他理论上应该都可以),所以就大概介绍一下,更多详细用法,可以自己体验,做一下简单的介绍。
介绍
支持php版本
需要注意的是,依赖包支持的php必须在PHP7.0以上。
引入
有兴趣可以查看源码 php-elasticsearch-orm
composer require vae/php-elasticsearch-orm
接入方式
- PHP
$config = require "elasticsearch.php";
//instance
$builder = Factory::builder($config);
- Laravel框架
在配置文件config/app.php注册服务提供者
'providers' => [
Vae\PhpElasticsearchOrm\Laravel\ElasticsearchOrm\OrmProvider::class,
]
实例化使用
$builder = app(\Vae\PhpElasticsearchOrm\Builder::class);
- Hyperf框架
创建OrmElasticsearchClientFactory.php
use \Vae\PhpElasticsearchOrm\Builder;
use \Vae\PhpElasticsearchOrm\Query;
use \Vae\PhpElasticsearchOrm\Grammar;
class OrmElasticsearchClientFactory{
public static function builder()
{
// 如果在协程环境下创建,则会自动使用协程版的 Handler,非协程环境下无改变
$hyperfBuilder = ApplicationContext::getContainer()->get(ClientBuilderFactory::class)->create();
$client = $hyperfBuilder->setHosts(['http://127.0.0.1:9200'])->build();
return new Builder(new Query(new Grammar(), $client));
}
}
- 其他(根据框架调整)
使用方法
- 创建
$builder->index('index')->create(['key' => 'value']);
//return collection
$builder->index('index')->createCollection(['key' => 'value']);
- 批量创建
$builder->index('index')->batchCreate(
[
'key1' => 'v1',
'key2' => 'v2',
],
[
'key3' => 'v3',
'key4' => 'v4',
]
);
- 更新
$builder->index('index')->update(['key' => 'value']);
$builder->index('index')->update(['key' => ['key2' => 'value']]);
- 批量创建/更新
$builder->index('index')->batchUpdateOrCreate(
[
'id' => '1',
'key1' => 'v1',
'key2' => 'v2',
],
[
'id' => 2,
'key3' => 'v3',
'key4' => 'v4',
]
);
- 删除
$builder->index('index')->deleteById($id) : bool
- 条件删除
$builder->index('index')->where('a', '=', 1)->delete()
- 查询
//单条查询
$builder->index('index')->first();
//列表
$builder->index('index')->get();
//分页
$builder->index('index')->paginate($page, $size) : Collection
//通过ID查询
$builder->byId($id) : stdClass
//查询异常
$builder->byIdOrFail($id) : stdClass
//分块查询
$builder->chunk(callback $callback, $limit = 2000, $scroll = '10m')
- 统计计数
$builder->count() : int
- 条件查询
支持操作符 [‘=’ => ‘eq’,‘>’ => ‘gt’,‘>=’ => ‘gte’,‘<’ => ‘lt’,‘<=’ => ‘lte’,‘!=’ => ‘ne’,]
$builder->whereTerm('key', 'value');
//模糊查询
//value without add wildcard '*'
$builder->whereLike('key', 'value');
//match
$builder->whereMatch('key', 'value');
//range
$builder->whereBetween('key', ['value1', 'value2']);
//whereIn
$builder->whereIn('key', ['value1', 'value2', ...]);
//嵌套查询
$builder->where(function(Builder $query){
$query->whereTerm('key', 'value');
});
//nested数据类型字段条件查询
$nestedKey = "nested_key";
$key = "key";
$builder->where("{$nestedKey}@{$key}", '=', 'value');
//nested数据类型组合条件
$nestedColumn = "nested_column";
$builder->whereNested($nestedColumn, function ($query) {
$query->where('key1', 'value1')
$query->where('key2', 'value2')
});
更多用法
关于更多的用法,可以查看源码文件:Vae\PhpElasticsearchOrm\Builder