#symfony #search #elasticsearch #provider
#symfony #Поиск #elasticsearch #поставщик
Вопрос:
Я пытаюсь создать пользовательский поставщик для моей сделки с сущностями. Прежде всего, это мой config.yml, где я определил свою сущность :
Deal:
persistence:
driver: orm
model: eDeallyCoreBundleEntityDeal
provider:
listener: ~
finder: ~
Я определяю его также в «provider.xml »
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<parameters>
<!-- Search providers -->
<parameter key="custom.search.provider.deal.class">eDeallyCoreBundleProviderDealProvider</parameter>
</parameters>
<services>
<!-- Search providers -->
<service id="custom.search.provider.deal" class="%custom.search.provider.deal.class%">
<tag name="fos_elastica.provider" index="afsy" type="Deal" />
<argument type="service" id="fos_elastica.object_persister.afsy.deal" />
<argument type="service" id="fos_elastica.client.default" />
<argument type="service" id="doctrine" />
</service>
</services>
Наконец, у меня есть файл «DealProvider.php »
класс DealProvider реализует ProviderInterface{
private $objectPersister;
private $client;
private $doctrine;
public function __construct(ObjectPersisterInterface $objectPersister, Client $client, ManagerRegistry $doctrine)
{
$this->objectPersister = $objectPersister;
$this->client = $client;
$this->doctrine = $doctrine;
}
/**
* Insert the repository objects in the type index
*
* @param Closure $loggerClosure
* @param array $options
*/
public function populate(Closure $loggerClosure = null, array $options = array())
{
echo "heyyyyy";
exit(1);
// Default values
$lastid = isset($options['offset']) ? intval($options['offset']) : 0;
$batchSize = isset($options['batch-size']) ? intval($options['batch-size']) : 100;
// Create query
$em = $this->doctrine->getManager();
$repository = $em->getRepository("eDeallyCoreBundle:Deal");
$qb = $repository->createQueryBuilder("deal")
->select("deal");
$qb->andWhere('deal.deleted = :false');
$qb->andwhere('deal.finished = :false');
$qb->andwhere('deal.stopped = :false');
$qb->andWhere('deal.start_date <= :date');
$qb->andWhere('deal.end_date >= :date');
// Memory managment
$em->getConnection()->getConfiguration()->setSQLLogger(null);
$this->client->setLogger(new PsrLogNullLogger());
// Batch items
do {
// Reset start time
if ($loggerClosure) {
$stepStartTime = microtime(true);
}
// Retrieve data
$date = new DateTime;
$objects = $qb->setParameter('date',$date->format("Y-m-d"))
->setParameter('false',0)
->getQuery()
->getResult();
if (count($objects) === 0) {
break;
}
// Convert and save objects
$this->objectPersister->insertMany($objects);
// Log
if ($loggerClosure) {
$objectsPerSecond = count($objects) / (microtime(true) - $stepStartTime);
$loggerClosure(sprintf('lastid %s, %d objects/s %s', $lastid, $objectsPerSecond, $this->getMemoryUsage()));
}
// Save last id for query
$lastid = end($objects)->getId();
// Memory managment
$em->clear();
unset($objects);
} while (true);
}
/**
* Get string with RAM usage information (current and peak)
*
* @return string
*/
protected function getMemoryUsage()
{
$memory = round(memory_get_usage() / (1024*1024),0); // to get usage in Mo
$memoryMax = round(memory_get_peak_usage() / (1024*1024)); // to get max usage in Mo
$message = '(RAM : current='.$memory.'Mo peak='.$memoryMax.'Mo)';
return $message;
}
}
Но, похоже, ничего не меняется, когда я выполняю ‘fos: elastica: populate’. Я поставил echo "hey"
и exit(1)
, чтобы попробовать, если что-то изменится, но нет.
Я должен что-то настроить в yml, чтобы включить поставщика? Спасибо 🙂
Извините за мой английский: / Я поляк
Комментарии:
1. вы что-то нашли?