earc / data-elasticsearch
eArc - 显式架构框架 - 数据 Elasticsearch 组件
Requires
- php: ^8.0
- earc/data: ^0.0
- elasticsearch/elasticsearch: ^7.12
Requires (Dev)
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属性为Max或Moritz并且具有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动词match与text字段进行匹配),请使用..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);
由于只有三个类(DocumentFactory、ElasticsearchDataBridge和IndexService),将它们复制并粘贴到您的项目中是一个合理的选择。
发布
发布 0.0
- 首个官方版本
- 支持php ^8.0
- 支持elasticsearch ^7.0