marmelab/sonata-elastica-bundle

此包已被放弃,不再维护。未建议替代包。

用于 Sonata admin bundle 的 elastica 适配器

安装量: 12,203

依赖者: 0

建议者: 0

安全性: 0

星标: 43

关注者: 15

分支: 13

开放问题: 4

类型:symfony-bundle

dev-master / 2.0.x-dev 2019-05-04 07:43 UTC

This package is not auto-updated.

Last update: 2020-01-20 07:12:21 UTC


README

archived 存档仓库
此代码不再维护。您可以随意分叉它,但使用它时请自担风险。

SonataElastica

通过 ElasticSearch 索引为 Sonata Admin 列表视图和过滤器提供动力,以加快导航。

Sonata Admin Bundle》提供了一个用于多种持久化类型(RDBMS、MongoDB、PHPCR)的 Web UI,其中一些类型具有有限的查询功能。如果您已经为特定模型创建了一个 ElasticSearch 索引,此包允许您使用该索引而不是本地仓库查询系统。这可能会根据您的数据结构和索引提供显著的性能提升。

要求

此包依赖于

  • sonata-project/admin-bundle
  • friendsofsymfony/elastica-bundle

它可以与 Doctrine (ORM、ODM、PHPCR-ODM) 或 Propel ORM 一起使用

  • sonata-project/doctrine-orm-admin-bundle - 版本 @15ed873424fb30af43569014a48f6d216fdefe78 之后
  • sonata-project/propel-orm-admin-bundle

安装

步骤 1:使用 Composer 下载

在您的 composer.json 文件中要求 marmelab/sonata-elastica-bundle

{
    "require": {
        "marmelab/sonata-elastica-bundle": "dev-master"
    }
}

然后像往常一样运行 composer.phar install

步骤 2:启用包

在内核中启用包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Marmelab\SonataElasticaBundle\MarmelabSonataElasticaBundle(),
    );
}

Elastica 索引配置

对于您要索引的每个模型,都必须指定标识符字段(id),类型为 integer。配置其他字段时,不再需要 multi_field,请参阅 UPGRADE-2.0-dev.md

对于字符串字段,如果您想能够对它们进行排序和搜索,您可能希望将它们声明为 multi_field,具有两个 "子字段"

  • 第一个,字段名称后跟名称,用于筛选,必须使用 index: analyzed
  • 第二个,名为 raw,用于排序,必须使用 index: not_analyzed

有关此信息,请参阅 ElasticSearch 文档(或 ,因为最近发布了 ElasticSearch 1.0 版本)。

示例

book:
    mappings:
        id: {type: integer}
        title:
            type: multi_field
            fields:
                title: { type: string, index: analyzed }
                raw: { type: string, index: not_analyzed }
        created_at: { type: date }
        ...

然后,在您的 Admin 类中,配置字段以使用 not_analyzed 子字段

    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->add('title', 'string', array(
                'sortable' => true,
                'sort_field_mapping' => ["fieldName" => "title.raw", "type"=> "string"] // To be able to sort by title.raw which is not_analyzed
            ))
            ...
        ;
    }

配置

要为特定的模型管理员启用ElasticSearch,您只需编辑services.xml中的sonata.admin标签。

  • 在管理员服务定义中添加一个第四个空参数。
  • sonata.admin标签中添加两个属性
    • searcher="elastica"
    • search_index="",设置您的elastica索引类型值

示例

对于Book实体

<service id="book.admin" class="Acme\BookBundle\Admin\BookAdmin">
    <argument/>
    <argument>Acme\BookBundle\Entity\Book</argument>
    <argument>AcmeBookBundle:BookCRUD</argument>
    <argument/>
    <tag name="sonata.admin" group="Content" label="Books" manager_type="orm"
         searcher="elastica" search_index="acme.book"/>
</service>

search_index=acme.book对应于elastica bundle的以下配置类型

fos_elastica:
    clients:
        default: { host: %elasticsearch_server_url%, port: %elasticsearch_server_port% }
    indexes:
        acme:
            types:
                book:
                    mappings:
                        ...
                author:
                    mappings:
                        ...

可选:完全绕过ORM hydrate

默认情况下,此bundle使用ElasticSearch查找匹配请求的实体或文档的id,然后查询底层持久化以获取真实实体或文档。这应该总是快速查询(因为它使用主键),但它也是无用的查询。实际上,在大多数情况下,用于实体hydrate所需的所有数据已经存在于ElasticSearch响应中。

此bundle允许使用自定义转换器服务将ElasticSearch结果hydrate到实体,从而节省一个查询。要启用此转换器,请将fastgrid参数添加到services.xml中的admin标签。

使用“基本”转换器

 <tag name="sonata.admin" group="Content" label="Books" manager_type="orm"
         fastGrid="true" searcher="elastica" search_index="acme.book"/>

使用您的自定义转换器

 <tag name="sonata.admin" group="Content" label="Books" manager_type="orm"
         fastGrid="true" transformer="my.custom.transformer.service" searcher="elastica" search_index="acme.book"/>

默认转换器使用setter进行基本hydrate并做出一些假设,例如实体提供了setId()方法。您当然可以使用自定义转换器来实现更复杂的hydrate逻辑,通过提供您的服务id。转换器类必须有一个transform方法,将elastica对象数组转换为从doctrine/propel仓库获取的模型对象数组。转换器类还应有一个用于objectClass属性的setter。

可选:使用字段映射

为了匹配Elastica索引和您的应用程序之间的字段,您可以将实体的映射配置为参数集合

<parameter key="book.admin.elastica.mapping" type="collection">
    <parameter key="contentType">_type</parameter>
    <parameter key="publicationDate">publication_timestamp</parameter>
    <parameter key="lastUpdateDate">last_update_timestamp</parameter>
</parameter>

然后在您的标签管理员中指定此参数

 <tag name="sonata.admin" group="Content" label="Books" manager_type="orm"
         search_index="acme.book"
         fields_mapping="book.admin.elastica.mapping" />

可选:为您的管理员定义自定义过滤器

您可以为实体管理员指定自定义过滤器(使用elastica过滤器类)。只需在管理员类中添加一个getExtraFilter()方法。

例如,如果在我的书籍管理员列表中,我只想获取PDF或epub格式的书籍

// in Acme\BookBundle\Admin\BookAdmin
use Elastica\Filter\Terms;

...

public function getExtraFilter() {
    $filter = new Terms();
    $filter->setTerms('format', array('pdf', 'epub'));

    return $filter;
}

可选:使用自定义表单过滤器类型

要使用自定义表单过滤器类,请指定它作为管理员标签的一部分

 <tag name="sonata.admin" group="Content" label="Books" manager_type="orm"
         search_index="acme.book"
         search_form="my.custom.filter.form_type" />

许可证

此bundle在MIT许可证下可用,由marmelab提供。