src/Repository/ProfileRecommendationRepository.php line 18

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\Profile\Profile;
  4. use App\Specification\ElasticSearch\Spec;
  5. use FOS\ElasticaBundle\Finder\TransformedFinder;
  6. use FOS\ElasticaBundle\HybridResult;
  7. use Symfony\Component\DependencyInjection\ContainerInterface;
  8. class ProfileRecommendationRepository
  9. {
  10.     private ?array $lastQuery null;
  11.     private array $scores = [];
  12.     private array $explains = [];
  13.     private TransformedFinder $finder;
  14.     public function __construct(ContainerInterface $container)
  15.     {
  16.         $this->finder $container->get('fos_elastica.finder.recommendations.profile');
  17.     }
  18.     /**
  19.      * @return mixed[]
  20.      */
  21.     public function getByRecommendationWeightsData(Spec $mainQuery, array $filtersQuery, ?array $customSpecQuery$offset$limit): array
  22.     {
  23.         $query = [
  24.             'query' => [
  25.                 'function_score' => [
  26.                     'query' => [
  27.                         //... required conditions
  28.                     ],
  29.                     'functions' => [
  30.                         //... weight filters
  31.                     ],
  32.                     'max_boost' => 99999,
  33.                     'score_mode' => 'sum',
  34.                     'boost_mode' => 'replace',
  35.                     'min_score' => 0,
  36.                 ],
  37.             ],
  38.             'from' => $offset,
  39.             'size' => $limit,
  40.             'explain' => true,
  41.         ];
  42.         $mainQuery $mainQuery->toEsQueryObject();
  43.         if(key($mainQuery) == 'bool')
  44.             $query['query']['function_score']['query'] = $mainQuery;
  45.         else
  46.             $query['query']['function_score']['query']['bool']['must'] = $mainQuery;
  47.         $customQueryIsEmpty = isset($customSpecQuery['bool']) && (empty($customSpecQuery['bool']) || empty(current($customSpecQuery['bool'])));
  48.         if($customSpecQuery && false === $customQueryIsEmpty) {
  49.             $query['query']['function_score']['query']['bool']['must'][] = [$customSpecQuery];
  50.         }
  51.         $query['query']['function_score']['functions'] = $filtersQuery;
  52.         //print_r(json_encode($query, JSON_PRETTY_PRINT));die;
  53.         $this->lastQuery $query;
  54.         //$this->debugLog->checkQuery($this->lastQuery);
  55.         $result $this->finder->findHybrid($query);
  56.         $profiles = [];
  57.         foreach ($result as /** @var HybridResult $item */ $item) {
  58.             /** @var Profile $profile */
  59.             $profile $item->getTransformed();
  60.             $profiles[] = $profile;
  61.             $this->scores[$profile->getId()] = $item->getResult()->getScore();
  62.             $this->explains[$profile->getId()] = json_encode($item->getResult()->getExplanation());
  63.         }
  64. dump($this->explains);
  65.         return $profiles;
  66.     }
  67.     public function getLastQuery(): ?array
  68.     {
  69.         return $this->lastQuery;
  70.     }
  71.     public function getScores(): array
  72.     {
  73.         return $this->scores;
  74.     }
  75.     public function getExplains(): array
  76.     {
  77.         return $this->explains;
  78.     }
  79. }