itvisionsy/es-orm

此包已被废弃,不再维护。作者建议使用 itvisionsy/php-es-mapper 包代替。

ElasticSearch PHP ORM 和查询构建器

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

README

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

ElasticSearch DSL查询构建器,用于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->name 获取名称属性,...

针对每个类型的查询

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

请注意

方法的参数映射到原始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 类非常简单。只需扩展它!如果您正在使用命名空间,您可以通过重写 modelNamespace 公共方法在查询类中设置模型命名空间。此方法应返回以
之后,您需要在查询结果对象上调用 ->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 许可下发布。