marmelab / sonata-elastica-bundle
用于 Sonata admin bundle 的 elastica 适配器
Requires
This package is not auto-updated.
Last update: 2020-01-20 07:12:21 UTC
README
存档仓库 此代码不再维护。您可以随意分叉它,但使用它时请自担风险。 |
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提供。