像使用 Laravel Query 一样的搜索 Elasticsearch
55

需要使用到ES大数据引擎,但无奈,不管是官方包还是Github上都没有找到自己想要的,那还说什么呢,自己操刀来一份吧。Github地址:https://github.com/crcms/elasticsearch

Composer和安装和Laravel下的加载

Version Matrix

Elasticsearch Version crcms/elasticsearch Branch
>= 6.0 1.*
>= 5.0, < 6.0 0.*

Install

composer require crcms/elasticsearch

Laravel

Modify config / app.php

'providers' => [
    CrCms\ElasticSearch\LaravelServiceProvider::class,
]

Pubish

php artisan vendor:publish --provider="CrCms\ElasticSearch\LaravelServiceProvider"

直接开始,示例如下:

Quickstart

Create


Route::get('test/create',function(\CrCms\ElasticSearch\Builder $builder){
    $result = $builder->index('index')->type('type')->create([
        'key' => 'value',
    ]);
    dump($result);
});

Update


Route::get('test/update',function(\CrCms\ElasticSearch\Builder $builder){
    $result = $builder->index('index')->type('type')->update('id',[
        'key' => 'value2',
    ]);
    dump($result);
});

Delete


Route::get('test/delete',function(\CrCms\ElasticSearch\Builder $builder){
    $result = $builder->index('index')->type('type')->delete('id');
    dump($result);
});

Select


Route::get('test/select',function(\CrCms\ElasticSearch\Builder $builder){
    $builder = $builder->index('index')->type('type');

    //SQL:select ... where id = 1 limit 1;
    $result = $builder->whereTerm('id',1)->first();

    //SQL:select ... where (key=1 or key=2) and key1=1
    $result = $builder->where(function (Builder $inQuery) {
        $inQuery->whereTerm('key',1)->orWhereTerm('key',2)
    })->whereTerm('key1',1)->get();

});

More

skip / take

$builder->take(10)->get(); // or limit(10)
$builder->offset(10)->take(10)->get(); // or skip(10)

term query

$builder->whereTerm('key',value)->first();

match query

$builder->whereMatch('key',value)->first();

range query

$builder->whereBetween('key',[value1,value2])->first();

where in query

$builder->whereIn('key',[value1,value2])->first();

logic query

$builder->whereTerm('key',value)->orWhereTerm('key2',value)->first();

nested query

$result = $builder->where(function (Builder $inQuery) {
    $inQuery->whereTerm('key',1)->orWhereTerm('key',2)
})->whereTerm('key1',1)->get();

更多的使用方法详见Github

最后:如果对您有用请给个Star吧,更多的是欢迎拍砖,支持开源。

本帖由系统于 6个月前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 7

@Summer 感谢!

6个月前

这个好!

6个月前

@纸牌屋弗兰克 ,因为之前查看github上很多都是直接一个query($params),如:

$params = [
    'index' => 'my_index',
    'type' => 'my_type',
    'body' => [
        'query' => [
            'match' => [
                'testField' => 'abc'
            ]
        ]
    ]
];

里面有一堆需要自己添加的数组结构才可以,感觉很不好用,所以想着自己开发一个。

目前功能可用,也用于实际项目中,欢迎提出一些好的改进和扩充的建议。

6个月前
BradStevens

不错不错

5个月前

@BradStev 欢迎拍砖 :smiley:

5个月前

es使用"elasticsearch/elasticsearch": "~6.0"包,如果删除不存在的数据会抛出异常,楼主有什么解决方法吗?不抛异常

5个月前

@rufo 几种方法
1、可在以删除外层自己捕获异常处理
2、删除之前使用first()方法判断
3、自己扩展相应的组件处理

5个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!