aviationcode/elasticsearch

Laravel elasticsearch 和 eloquent 集成

v0.15.0 2024-05-17 12:02 UTC

README

Latest Version on Packagist Total Downloads Build Status

此包封装了 elasticsearch/elasticsearch composer 包并实现了 Laravel 集成。通过该包可以轻松使用 Eloquent 模型与 Elasticsearch 进行交互。

安装

通过 Composer

$ composer require aviationcode/elasticsearch

配置

默认情况下,我们使用 localhost:9200 来搜索您的 Elasticsearch 实例。如果使用的是默认设置,则无需进行任何配置。您可以使用以下 .env 设置来配置如何连接到您的 Elasticsearch 实例。

用法

通过使用 ElasticSearchable 特性或扩展 ElasticsearchModel 来配置模型以使用 Elasticsearch。

use AviationCode\Elasticsearch\Model\ElasticSearchable;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use ElasticSearchable;
}

自定义映射属性

我们尝试从您的 $dates 数组和主键中检测 Elasticsearch 映射字段。我们无法正确检测其他字段。

在这种情况下,Elasticsearch 将自动尝试猜测映射字段,但建议您显式定义这些字段为正确的类型。

use AviationCode\Elasticsearch\Model\ElasticSearchable;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use ElasticSearchable;
    
    public $mapping = [
        'category' => ['type' => 'keyword'],
        'properties' => ['type' => 'object', 'dynamic' => true],
        'ip' => ['type' => 'ip'],
    ];
}

使用 Elasticsearch 文档以查找所有可用选项。

非数字键

当使用 UUID 或其他非数字键时,请确保正确配置您的模型。这将确保我们在模型映射中使用正确的映射。

use AviationCode\Elasticsearch\Model\ElasticSearchable;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use ElasticSearchable;

    protected $keyType = 'string';    
}

自定义索引名称

您可能希望使用自定义名称或使用与您的 Eloquent 模型关联的现有索引名称。就像您可以定义使用的数据库表一样,您也可以定义使用的索引名称。

use AviationCode\Elasticsearch\Model\ElasticSearchable;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use ElasticSearchable;
    
    public $indexName = 'my_custom_index_name';
}

注意:您仍然可以使用 $indexVersion 在索引名称末尾添加 vX

版本化索引

如果您喜欢版本化索引名称,可以使用 $indexVersion 名称。这将将在索引名称末尾添加 _vX,其中 X 是索引版本。

use AviationCode\Elasticsearch\Model\ElasticSearchable;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use ElasticSearchable;
    
    public $indexVersion = 2;
}

查询

namespace App\Http\Controllers;

use App\Article;
use AviationCode\Elasticsearch\Facades\Elasticsearch;
use AviationCode\Elasticsearch\Query\Dsl\Boolean\Filter;
use AviationCode\Elasticsearch\Query\Dsl\Boolean\Must;
use Illuminate\Http\Request;

class ArticleController 
{
    public function index(Request $request)
    {
        return Elasticsearch::forModel(Article::class)
            ->query()
            ->filter(function (Filter $filter) use ($request) {
                if ($user = $request->query('user')) {
                    $filter->term('user', $user); 
                }
            })
            ->must(function (Must $must) use ($request) {
                if ($query = $request->query('q')) {
                    $must->queryString($query); 
                }        
            })
            ->get();
    }
}

没有 Eloquent 模型。

namespace App\Http\Controllers;

use App\Article;
use AviationCode\Elasticsearch\Facades\Elasticsearch;
use AviationCode\Elasticsearch\Query\Dsl\Boolean\Filter;
use AviationCode\Elasticsearch\Query\Dsl\Boolean\Must;
use Illuminate\Http\Request;

class ArticleController 
{
    public function index(Request $request)
    {
        return Elasticsearch::query('article')
            ->filter(function (Filter $filter) use ($request) {
                if ($user = $request->query('user')) {
                    $filter->term('user', $user); 
                }
            })
            ->must(function (Must $must) use ($request) {
                if ($query = $request->query('q')) {
                    $must->queryString($query); 
                }        
            })
            ->get();
    }
}

聚合

使用模型进行聚合。

namespace App\Http\Controllers;

use App\Article;
use AviationCode\Elasticsearch\Facades\Elasticsearch;

class ArticlesPerUserPerDayController 
{
    public function index()
    {
        $qb = Elasticsearch::forModel(Article::class)->query();

        $qb->aggregations()
            ->dateHistogram('date', 'created_at', '1d')
            ->terms('date.users', 'user');

        return $qb->get()->aggregations;
    }
}

不使用 Eloquent 模型进行聚合。

namespace App\Http\Controllers;

use App\Article;
use AviationCode\Elasticsearch\Facades\Elasticsearch;

class ArticlesPerUserPerDayController 
{
    public function index()
    {
        $qb = Elasticsearch::query('article');

        $qb->aggregations()
            ->dateHistogram('date', 'created_at', '1d')
            ->terms('date.users', 'user');

        return $qb->get()->aggregations;
    }
}

控制台命令

elastic:create-index 创建 Elasticsearch 索引

变更日志

有关最近更改的更多信息,请参阅 变更日志

测试

$ composer test

贡献

有关详细信息以及待办事项列表,请参阅 contributing.md

安全

如果您在 elasticsearch 包中发现了安全漏洞,请发送电子邮件至 Ken Andries 的 ken.andries.1992@gmail.com。所有安全漏洞都将得到及时处理。

鸣谢

许可证

许可证。有关更多信息,请参阅 许可证文件