itvisionsy/php-es-orm

PHP ElasticSearch ORM 和查询构建器

v1.7.5 2017-03-23 12:23 UTC

README

这是一个简单的 PHP ElasticSearch ORM 映射器。

ElasticSearch DSL 查询构建器 for PHP.

需要合作者

如果您能加入我一起更新和维护这个项目,请发送邮件至 muhannad.shelleh@live.com

需求

  • PHP 5.4+
  • Elasticsearch PHP SDK v>=1 and <2
  • ElasticSearch 服务器 1.6. ES2 未测试,所以请谨慎使用。

安装

Composer

composer require itvisionsy/php-es-orm

手动下载

前往最新的版本 这里 然后使用下载按钮下载。

如何使用?

对于查询构建器,请 阅读此 README

很简单

按索引查询

  1. 创建一个扩展主要查询类的类(用于通用索引)。
  2. 填写抽象方法。它们是自我描述的。
  3. 使用创建的类 ::find($type, $id)::query($type, array $query =[])::all($type),您将获得一个包含 Model 对象的列表,您可以对象属性访问以获取所有信息。例如,$model->name 获取 name 属性,...

按类型查询

  1. 创建一个扩展类型查询类的类。或者创建一个扩展主要查询类并实现 TypeQueryInterface 接口和使用 TypeQueryTrait 特性的类
  2. 填写抽象方法。它们是自我描述的。
  3. 使用方法:::find($id)::all()::query(array $query=[])。您将以相同的方式获得一个包含 Model 对象的列表。

请注意

方法的参数映射到原始 elasticsearch 方法和参数如下

查询数据

查询类只是一个简单的接口,允许您发送 DSL 查询或执行其他 ElasticSearch 请求。例如,::query() 方法将期望接收一个包含格式良好的 DSL 查询的关联数组。

但是,您可以使用查询构建器构建查询并从中获取格式良好的 DSL 数组。

您可以使用类型查询构建器构建查询并直接执行它

$result = TypeQuery::builder()
    ->where('key1','some value')
    ->where('key2',$intValue,'>')
    ->where('key3','value','!=')
    ->where('key4', ['value1','value2'])
    ->execute();
//$result is a \ItvisionSy\EsMapper\Result instance

或者您可以使用通用查询构建器构建查询,然后您可以使用其他工具修改它

//init a builder object
$builder = \ItvisionSy\EsMapper\QueryBuilder::make();

//build the query using different methods
$query = $builder
                ->where('key1','some value') //term clause
                ->where('key2',$intValue,'>') //range clause
                ->where('key3','value','!=') //must_not term clause
                ->where('key4', ['value1','value2']) //terms clause
                ->where('email', '@hotmail.com', '*=') //wildcard search for all @hotmail.com emails
                ->sort('key1','asc') //first sort option
                ->sort('key2',['order'=>'asc','mode'=>'avg']) //second sort option
                ->from(20)->size(20) //results from 20 to 39
                ->toArray();

//modify the query as you need
$query['aggs']=['company'=>['terms'=>['field'=>'company']]];

//then execute it against a type query
$result = TypeQuery::query($query);
//$result is a \ItvisionSy\EsMapper\Result instance

有关更多信息,请参阅 此文件

检索结果

返回的结果集实现了 ArrayAccess 接口,以便访问结果中的特定文档。

$result = SomeQuery::all();

然后您可以这样获取一个文档

$doc = $result[1]; //gets the second document

或者您可以使用点表示法,如下所示

$result->fetch('hits.hits.0'); //for any absolute access

访问文档数据

在模型对象上,您可以通过多种方式访问结果

  1. 使用对象属性访问器 $object->attribute
    • 如果属性以下划线 (_) 开头,则首先尝试从元信息中获取它,然后是属性,最后是内部对象属性。
    • 如果属性以前两个下划线 (__) 开头,则首先尝试从内部对象属性中获取,然后是属性,然后是元信息。
    • 如果没有优先级下划线,则将尝试从属性中获取,然后是元信息,最后是内部对象属性。
  2. 使用 $object->getAttributes()[attribute],因为 getAttributes() 将返回一个数组(仅第一级)作为文档数据。
  3. 使用 $object->getAttributes($attribute1, $attribute2, ...),这将根据请求的属性返回单个(或数组)值。

创建新文档

两种方式都可行

  1. 使用索引查询静态方法

    IndexQuery::create(array $data, $type, $id=null, array $parameters=[])
  2. 使用类型查询静态方法

TypeQuery::create(array $data, $id=null, array $parameters=[])

更新文档

您可以通过以下方式更新已索引的文档:

  1. 或者 重新索引 具有相同类型和 id 的文档,或者
  2. 或者在模型的对象上使用 update(array $data, array $parameters=[]) 方法
TypeQuery::find(1)->update(['new_key'=>'value','old_key'=>'new value'],[]);

删除文档

您可以通过与更新文档相同的方式删除它

  1. 在索引查询上调用静态方法 ::delete($type, $id)
  2. 在模型的对象上调用方法 ->delete()

添加额外的方法

您可能需要添加额外的自定义方法,如 top($numOfDocs) 或其他任何方法。为此,您需要在查询子类中将您希望创建的方法名作为受保护的创建。名称应该以 _(例如 _top)为前缀,然后,您可以

  • 通过前缀 get 调用它,因此要调用 _top(500) 方法,只需调用 getTop(500),它将被映射为公共静态和公共。

  • 重写 _allowPublicAccess 静态受保护方法以添加要公开的额外方法。请注意,在重写时,不要忘记与父结果合并,以免丢失旧的结果

    protected _allowPublicAccess(){
        return array_merge(parent::_allowPublicAccess(), ['top','any',...]);
    }

    这样,您将保存父级的允许方法。

扩展 Model 类

您可以轻松扩展 Model 类。只需扩展它!如果您正在使用命名空间,您可以通过重写模型命名空间公共方法在查询类中设置模型命名空间。此方法应返回以
之后,您需要在查询结果对象上调用 ->setModelClass($class)

示例

请检查 tests/ 文件夹。基本上,case1.php 是主文件。

\
|
+-- TestsIndexQuery (TestsIndexQuery.php)   Main index query class.
|   |                                       Maps results to \Models\ namespace.
|   |
|   +-- \FooTypeQuery (FooTypeQuery.php)    Type index query class.
|   |
|   +-- \BarTypeQuery (BarTypeQuery.php)    Type index query class. 
|
|-- Models\
    |
    +-- Foo (FooMode.php)                   Foo model class
    |
    +-- Bar (BarModel.php)                  Bar model class

许可

此代码在 MIT 许可下发布。