tamizh / laravel-es
Requires
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2024-09-20 00:46:22 UTC
README
用于Elasticsearch的基本ORM软件包(搜索和CRUD功能) - 用于Elasticsearch 5.0及以下版本
安装
composer require tamizh/laravel-es
或在composer.json中添加以下行
"tamizh/laravel-es" : "dev-master",然后运行composer update
配置
将服务提供者添加到您的config/app.php文件中
'providers' => [
//...
Tamizh\LaravelEs\ElasticsearchServiceProvider::class,
],
将外观添加到您的config/app.php文件中
'aliases' => [
//...
'Elasticsearch' => Tamizh\LaravelEs\Elasticsearch::class,
],
使用php artisan vendor:publish
发布配置文件
修改config/elasticsearch.php。
示例
return [
'hosts' => [
env('ES_HOSTS', 'localhost:9200')
],
'log_path' => 'storage/logs/',
];
在您的模型中替代继承Model类的方式,使用Elasticsearch来使用以下功能。
class Log extends Elasticsearch
{
public $_index = 'logs*';
public $_type = 'log';
}
可用函数
-
match & match_phrase - 返回匹配文本的结果
Log::match('field', 'text')->get() Log::matchPhrase('field', 'hello world')->get() Log::matchPhrasePrefix('field', 'hello')->get()
-
boolMust, boolMustNot, boolShould, boolShouldNot - 布尔查询(相当于MySQL中的AND和OR)
Log::boolMust(function($query){ $query->match('field', 'text'); })->get()
-
terms - 返回匹配术语数组的结果
Log::terms('field', array)->get()
-
aggs - 聚合结果(子聚合尚未支持)
Log::aggs(function($query){ $query->terms('field')->size(10)->minDocCount(10); }, 'top_logs')
通过以下方式实现多个聚合:
Log::aggs(function($query){ $query->terms('field')->size(10)->minDocCount(10); }, 'top_logs') ->aggs(function($query){ $query->sum('field') });
通过以下方式实现子聚合:
Log::aggs(function($query){ $query->terms('field') ->aggs(function($sub_query){ $sub_query->sum('field'); }); }, 'top_logs')
可用函数 a) terms b) cardinality c) max d) min e) sum_bucket f) sum g) date_histogram(带间隔选项[默认 - 月])h) avg
-
sort - 对查询结果进行排序
Log::sort('field', 'desc')
或
Log::sort(function($query){ $query->script('return doc['error'].value + doc['success'].value') })
-
scroll - 获取滚动迭代器对象
$results = Log::match('field', 'text')->size(100)->scroll(); foreach($results as $result){ // logic goes here }
-
size - 结果集合的大小
Log::match('field', 'text')->size(100)->get()
-
highlight - 突出显示所选文本
Log::match('field', $text)->highlight('field')->get()
-
first - 获取第一个模型
Log::match('field', $text)->first()
-
save - 将当前模型保存到ES
$log = Log::match('field', $text)->first(); $log->count = $log->count + 1; $log->save();
-
delete - 从ES中删除当前模型
$log = Log::match('field', $text)->first(); $log->delete();
或
Log::delete(1);
-
query_string - ES中的查询字符串函数
$log = Log::queryString(function($query){ $query->query('tech*') ->fields(['errors', 'content']); })->get();
布尔函数中
Log::boolMust(function($query){ $query->queryString(function($query){ $query->query('tech*') ->fields(['errors', 'content']); }) })->get();
-
exists - 存在条件功能
$log = Log::exists('field')->get();
-
index - 在ES中索引文档
Log::index(['key' => 'value', 'key1' => 'value1'], id);
-
update - 在ES中更新文档
Log::update(['new_key' => 'new_value', 'old_key' => 'new_value'], id);
-
removeKey - 从ES中删除不需要的键
Log::removeKey('unwanted_key', id);
-
script - 脚本功能
Log::script("doc['errors'].value > 10")->get()
-
count - 获取当前结果的文档计数
Log::script("doc['errors'].value > 10")->count()
-
range - 获取介于范围内的结果集
Log::range('error_rate', ['gte'=>20, 'lte'=>80])->get();
-
rangeBetween - 获取介于范围内的结果集(range的简化版本)
Log::rangeBetween('error_rate', 20, 30)->get(); 20 -> gte 30 -> lte
-
from - elasticsearch中的分页选项[MySQL偏移量][仅适用于10000结果窗口,对于更大的分页建议使用scroll]
Log::match('field', 'text')->size(100)->from(200)->get()
-
paginate - 添加分页[LengthAwarePaginator] 使用此API将为您提供Laravel分页器的完整功能访问
Log::match('field', 'text')->paginate($perPage, $page)
注意 - 这可以在当前查询的前10000个结果集中使用。 因此,如果您打算使用整个结果集,则更好的选项是使用scroller。
-
search or searchRaw - 通过原始数组查询进行搜索
Log::search([ 'body'=>[ "query"=>[ "match" => [ "field" => "text" ] ] ] ])->get()
注意 - 对于查询格式,请参阅官方文档Elasticsearch PHP软件包
-
topHits - 获取聚合的最顶部的 hits
Log::aggs(function(){ $query->terms('user.id')-aggs(function(){ $query->topHits()->size(5); // get top 5 hits of the user }, 'hits'); }, 'users')
-
multiMatch - 在多个字段上搜索
Log::multiMatch(['user','error'], 'query', 'phrase_prefix');
-
fromType - 在特定类型上搜索
Log::match('field', 'text')->fromType('warinings')->get()
-
find - 通过其ID查找文档
Log::find("AWAMbhhhXkO5BRWWZAw6");
-
updateByQuery (实验性) - 使用查询更新文档(尚未准备就绪)
Log::match('field', 'test')->script("doc['update_field'].value = update_value")->updateByQuery()
注意
- 以下字段名称是保留的 - _id, _type, _index, _highlight
待办事项
- 编写测试用例(稳定版本)
- 添加更多功能
- 索引功能
- MySQL查询格式支持