alamirault/elasticsearch-form-bundle

发布文档、搜索、表单监听器

dev-master 2019-07-14 15:31 UTC

README

Build Status

概览

这个Symfony包允许创建表单并将字段转换为Elasticsearch查询。创建表单类型后,您将能够从表单类型更新Elasticsearch查询。

想法是

  1. 创建一个表单类型,为每个字段传递选项 elastic_filter_condition
  2. 使用 ElasticsearchMaker 提交搜索、分页、排序。

安装

  1. 运行 composer require alamirault/elasticsearch-form-bundle

  2. 在您的 app/AppKernel.php 中注册此包

     <?php
     ...
     public function registerBundles()
     {
         $bundles = array(
             ...
             new Alamirault\ElasticsearchBundle\AlamiraultElasticsearchFormBundle(),
             ...
         );
     ...

配置

alamirault_elasticsearch_form:
    clients:
        default:
            connections:
                - { host: "elasticsearch_host", port: 9200, proxy: null }
            logger: logger.api
            indexes:
                users:
                    mapping: '%kernel.project_dir%/src/Alamirault/LogsBundle/Resources/elasticsearch/mapping/change.yml'

用法

在 ExampleFilterType 类中

     public function buildForm(FormBuilderInterface $builder, array $options)
        {
                    $builder->add('uuid', TextType::class, [
                        'elastic_filter_condition' => function (?string $value) {
                            if (is_null($value)) {
                                return;
                            }
        
                            return new Match('uuid', $value);
                        },
                    ])
        }

在控制器中制作一个搜索页面列表

    public function indexAction(Request $request, FormFactoryInterface $formFactory, EntityManagerInterface $entityManager,
                                TranslatorInterface $translator, BoLogEntryDenormalizer $denormalizer)
    {
        $form = $formFactory->create(ExampleFilterType::class);

        $sortableChanges = $this->elasticsearchMaker->manageForm($form, $request, $this->indexRegistry,
            "changes", $denormalizer);

        return $this->render('AlamiraultLogsBundle:Changes:index.html.twig',
            [
                "form" => $form->createView(),
                "sortableChanges" => $sortableChanges,
            ]
        );
    }

通过uuid值搜索用户

        $matchLike = new Query\Wildcard('uuid', $value."*");
        $query = new Query();
        $query->setQuery($matchLike);
        $query->setSource(["object_uuid"]);

        $resultSet = $this->elasticsearchMaker->makeSearch($this->indexRegistry, "users", $query);

发布文档

            $normalized = $serializer->normalize($user) //User is an object;

            $doc = new Document($user->getUuid(), $normalized);

            $index = $this->indexMaker->getIndex($this->indexRegistry, "users", IndexMaker::WRITE);

            $type = new Type($index, '_doc'); // Only if elasticsearch <7.2.0
            $type->addDocuments([$doc]);

测试

./vendor/bin/phpunit --bootstrap vendor/autoload.php Tests/