FOS эластичный пакет 4. * - автоматическая индексация объекта не работает - PullRequest
0 голосов
/ 02 мая 2018

В настоящее время я пытаюсь разрешить пакету FOS Elastica автоматически обновлять индекс при появлении новых записей со следующими настройками:

fos_elastica:
clients:
    default: { host: localhost, port: 9200 }
indexes:
    audit:
        finder: ~
        types:
            audit_log:
                persistence:
                    driver: orm
                    model: AuditBundle\Entity\AuditLog
                    # Problem occurs here. This should trigger automatic inserts, updates and deletes
                    listener: ~
                    provider: ~
                    finder: ~
                    model_to_elastica_transformer:
                        service: app.audit_transformer

Однако, моя пользовательская модель для эластичного трансформатора не сработала. Кто-нибудь есть идеи, как это исправить?

1 Ответ

0 голосов
/ 09 мая 2018

В моем случае у меня был подписчик на событие, который вставлял строки в базу данных SQLite без Entity Manager. Это привело к ситуации, когда прослушиватель событий пакета FOSElastica не обнаружил изменений. Чтобы проиндексировать эти строки в ElasticSearch, я расширил подписчика:

public function __construct(
    TokenStorage $securityTokenStorage,
    EntityManager $entityManager,
    // These lines
    ObjectPersisterInterface $postPersister,
    IndexableInterface $indexable,
    array $config
){
    $this->securityTokenStorage = $securityTokenStorage;
    $this->audit = $entityManager;

    // These lines
    $this->objectPersister = $postPersister;
    $this->indexable = $indexable;
    $this->config = $config;

    parent::__construct($postPersister, $indexable, $config);
}

public function onFlush(...)
{
    // ....
    //* Insert audit in ElasticSearch
    $audit = $this->audit->getRepository('AuditBundle:AuditLog')->findLast();

    if ($this->objectPersister->handlesObject($audit)) {
        if ($this->isObjectIndexable($audit)) {
            $this->objectPersister->insertOne($audit);
        }
    }
    // ....
}

/**
 * @param object $object
 * @return bool
 */
private function isObjectIndexable($object)
{
    return $this->indexable->isObjectIndexable(
        self::AUDIT_INDEX,
        self::AUDIT_TYPE_NAME,
        $object
    );
}
...