earc/data-elasticsearch

eArc - 显式架构框架 - 数据 Elasticsearch 组件

0.0 2021-04-10 12:50 UTC

This package is auto-updated.

Last update: 2024-09-29 06:02:58 UTC


README

earc/data持久处理器的Elasticsearch桥接器。

目录

安装

通过composer安装earc数据Elasticsearch库。

$ composer require earc/data-elasticsearch

基本使用

引导

初始化earc/data包。

use eArc\Data\Initializer;

Initializer::init();

如果你的Elasticsearch服务器不在localhost:9200或者你需要认证,你必须配置它。

use eArc\DataElasticsearch\ParameterInterface;

$hosts = ['https://user:pass@elasticsearch.my-server.com:32775'];

di_set_param(ParameterInterface::CLIENT_HOSTS, $hosts);

然后注册earc/data-elasticsearch桥接器。

use eArc\Data\ParameterInterface;
use eArc\DataElasticsearch\ElasticsearchDataBridge;

di_tag(ParameterInterface::TAG_ON_PERSIST, ElasticsearchDataBridge::class);
di_tag(ParameterInterface::TAG_ON_REMOVE, ElasticsearchDataBridge::class);
di_tag(ParameterInterface::TAG_ON_FIND, ElasticsearchDataBridge::class);

现在你的实体将被索引并自动从索引中删除。你现在可以通过Elasticsearch搜索earc/data实体。

初始化索引

如果你在安装earc/data-elasticsearch桥接器之前已经持久化了实体,你可以使用IndexService::rebuildIndex()来索引已经存在于你的数据存储中的实体。

use eArc\DataElasticsearch\IndexService;

di_get(IndexService::class)->rebuildIndex([
    // list of your entity classes
]);

这只需要做一次。新的实体和更新将自动索引。

搜索

搜索非常简单。

$primaryKeys = data_find(MyUserEntity::class, ['name' => ['Max', 'Moritz'], 'age' => 21]);
$userEntities = data_load_batch(MyUserEntity::class, $primaryKeys);

这将找到所有MyUserEntitiy类具有name属性为MaxMoritz并且具有age属性为21的实体。

如果你不需要主键,data_find_entities更短。

$userEntities = data_find_entities(MyUserEntity::class, ['name' => ['Max', 'Moritz'], 'age' => 21]);

要找到所有现有主键,请使用空数组。

$allUserPrimaryKeys = data_find(MyUserEntity::class, []);

增强语法

earc/data-elasticsearch支持比完整的earc/data data_find语法更多的内容。从对范围和全文搜索的支持到可能的每个Elasticsearch查询。这种一刀切的方法易于开始,但像Elasticsearch dsl一样难以掌握。

范围

范围的使用是通过一个..range后缀完成的。

data_find(MyUserEntity::class, ['age..range' => ['>' => 18]]);

这将给出一个大于18的开放范围。

也可以实现闭合范围。

data_find(MyUserEntity::class, ['lastLogin..range' => ['>=' => '2021-01-01', '<=' => '2021-01-31']]);

匹配

要执行全文搜索(使用Elasticsearch动词matchtext字段进行匹配),请使用..match后缀。

data_find(MyUserEntity::class, ['city..match' => 'Münster']);

文本

..text后缀给出对text字段的(代码)搜索。这在你搜索单个单词但不知道目标是大写、小写还是首字母大写时很有用。

data_find(Price::class, ['currency..text' => 'eur']);

存在

Elasticsearch不知道null值。而不是IS NOT NULL,你可以检查属性是否存在,这在大多数情况下是相同的。

data_find(Price::class, ['currency..exists' => null]);

或者检查属性是否存在,这类似于IS NULL

data_find(Price::class, ['currency..exists_not' => null]);

_id

getter getPrimaryKey()用作Elasticsearch文档id。因此,你可以使用属性_id来测试一个或多个主键。

data_find(MyUserEntity::class, ['_id' => ['1', '2', '392']]);

嵌入实体

要查询嵌入实体,您可以使用点符号。

data_find(MyUserEntity::class, [
    'login.email' => 'kai@email.com',
    'login.password' => 'l9TFoW5549', 
]);

嵌入实体集合(嵌套)

嵌入实体集合有两个属性_entityName_items_items调用嵌套查询。

data_find(MyUserEntity::class, [
    'group._entityName' => Permission::class,
    'group._items' => [
        'name' => ['admin', 'moderator'],
        'active' => true,
    ], 
]);

连接

Elasticsearch不知道连接,但可以通过两个独立的查询来实现。

$colorCategories = data_find(AttributeCategory::class, ['name..match' => ['colour', 'color']]);
$colors = data_find(Attribute::class, [
    'attributeCategory' => $colorCategories,
    'name..match' => ['blue', 'green', 'violet'],
]);

这适用于一对一和多对一关系。

如果你的实体使用了集合,例如连接表示一对一或一对多关系,那么你必须使用.items内嵌语法。

$colors = data_find(Attribute::class, ['name..match' => ['white']]);
$colorCategories = data_find(AttributeCategory::class, ['attributes.items' => $colors]);

原始查询

您始终可以通过使用.raw后缀来调用elasticsearch dsl的原始力量。

data_find(Price::class, [        
    'offerStartDate.raw' => ['bool' => ['must' => [
        ['exists' => ['field' => 'offerStartDate']],
        ['range' => ['offerStartDate' => ['lte' => 'now']]],
    ]]],
]);

原始搜索体

要在elasticsearch dsl中编写完整的搜索,请使用.raw_body键。

data_find(Price::class, [        
    '.raw_body' => [
        'query' => [
            'constant_score' => [
                'filter' => [
                    'bool' => [
                        'must' => [
                            ['exists' => ['field' => 'offerStartDate']],
                            ['range' => ['offerStartDate' => ['lte' => 'now']]],
                        ],
                    ],
                ],
            ],
        ],
    ],
]);

高级使用

索引名称

实体的索引名称为earc-data-加上完全限定类名的小写版本,其中反斜杠\\被减号-替换。可以配置earc-data前缀。

use eArc\DataElasticsearch\ParameterInterface;

di_set_param(ParameterInterface::INDEX_PREFIX, 'my-index-prefix');

实体白名单和黑名单

默认情况下,所有实体都会被索引。这可以通过白名单或黑名单进行更改。

use eArc\DataElasticsearch\ParameterInterface;
use eArc\DataElasticsearchTests\Entities\BlacklistedEntity;

di_set_param(ParameterInterface::WHITELIST, [
    // list of entity class names
    BlacklistedEntity::class => true,
    // ...
]);

只有白名单上的实体会被索引。

use eArc\DataElasticsearch\ParameterInterface;

di_set_param(ParameterInterface::BLACKLIST, [
    // list of entity class names
    Attribute::class => true,
    // ...
]);

除了黑名单上的实体之外的所有实体都会被索引。

如果配置了黑白名单,则仅使用白名单。

扩展Elasticsearch桥接器

要扩展elasticsearch桥接器,只需装饰其类之一。

use eArc\DataElasticsearch\DocumentFactory;

di_decorate(DocumentFactory::class, MyDocumentFactory::class);

由于只有三个类(DocumentFactoryElasticsearchDataBridgeIndexService),将它们复制并粘贴到您的项目中是一个合理的选择。

发布

发布 0.0

  • 首个官方版本
  • 支持php ^8.0
  • 支持elasticsearch ^7.0