public function searchAdvanced($q = '')
 {
     if ($q == '') {
         $baseQuery = new \Elastica\Query\MatchAll();
     } else {
         $baseQuery = new \Elastica\Query\Match();
         $baseQuery->setFieldQuery('description', $q);
         $baseQuery->setFieldFuzziness('description', 0.7);
         $baseQuery->setFieldMinimumShouldMatch('description', '80%');
     }
     $boolFilter = new \Elastica\Filter\BoolFilter();
     $dateFrom = new \DateTime();
     $dateFrom->sub(new \DateInterval('P7D'));
     $dateTo = new \DateTime();
     $dateTo->add(new \DateInterval('P1D'));
     $boolFilter->addMust(new \Elastica\Filter\Range('createdAt', array('gte' => \Elastica\Util::convertDate($dateFrom->getTimestamp()), 'lte' => \Elastica\Util::convertDate($dateTo->getTimestamp()))));
     /*
      * $boolFilter->addMust(
      *     new \Elastica\Filter\Term(array('isPublished' => true))
      * );
      * $boolFilter->addMust(
      *     new \Elastica\Filter\Terms('isPublished', array('1', '2', '3'))
      * );
      */
     /*
      * $baseQuery = new \Elastica\Filter\Bool();
      * $baseQuery->addShould(
      *     new \Elastica\Filter\Term(array('id' => intval($q)))
      * );
      * $baseQuery->addShould(
      *     new \Elastica\Filter\Term(array('amount' => floatval($q)))
      * );
      * $filtered = new \Elastica\Query\Filtered();
      * $filtered->setFilter($baseQuery);
      * return $this->finder->find($filtered);
      */
     /*
      * $baseQuery  = new \Elastica\Query\Bool;
      * $idQueryTerm = new \Elastica\Query\Term;
      * $idQueryTerm->setTerm('id', intval($q));
      * $baseQuery->addShould($idQueryTerm);
      */
     $filtered = new \Elastica\Query\Filtered($baseQuery, $boolFilter);
     $query = \Elastica\Query::create($filtered);
     $query->addSort(array('id' => array('order' => 'asc')));
     $query->setSize(1);
     return $this->find($query);
 }
 public function searchAdvanced(AdvancedSearch $advancedSearch)
 {
     if (!$advancedSearch->innerObjectIsDefine()) {
         $match = new \Elastica\Query\MatchAll();
     } else {
         $match = new \Elastica\Query\BoolQuery();
         if ($advancedSearch->getMarque()) {
             $match->addMust(new \Elastica\Query\Match('modeleMarque.marque.id', $advancedSearch->getMarque()));
         }
         if ($advancedSearch->getModele()) {
             $match->addMust(new \Elastica\Query\Match('modeleMarque.modele.id', $advancedSearch->getModele()));
         }
         if ($advancedSearch->getBoitier()) {
             $match->addMust(new \Elastica\Query\Match('boitier.id', $advancedSearch->getBoitier()));
         }
         if ($advancedSearch->getCarburant()) {
             $match->addMust(new \Elastica\Query\Match('carburant.id', $advancedSearch->getCarburant()));
         }
     }
     $boolFilter = new \Elastica\Filter\BoolFilter();
     if ($advancedSearch->getPrixMin()) {
         $boolFilter->addMust(new \Elastica\Filter\Range('prix', array('gte' => intval($advancedSearch->getPrixMin()))));
     }
     if ($advancedSearch->getPrixMax()) {
         $boolFilter->addMust(new \Elastica\Filter\Range('prix', array('lte' => $advancedSearch->getPrixMax())));
     }
     if ($advancedSearch->getKmMin()) {
         $boolFilter->addMust(new \Elastica\Filter\Range('kmParcouru', array('gte' => intval($advancedSearch->getKmMin()))));
     }
     if ($advancedSearch->getKmMax()) {
         $boolFilter->addMust(new \Elastica\Filter\Range('kmParcouru', array('lte' => $advancedSearch->getKmMax())));
     }
     $filtered = new \Elastica\Query\Filtered($match, $boolFilter);
     $query = \Elastica\Query::create($filtered);
     return $this->find($query);
 }
 /**
  * @param $appliedFilters
  * @param $elasticaQuery
  *
  * @return array
  */
 public function applyFilterToElasticaQuery($appliedFilters, $elasticaQuery)
 {
     $rangeFilters = new \Elastica\Filter\Range();
     $boolFilter = new \Elastica\Filter\BoolFilter();
     $filters = array();
     foreach ($appliedFilters as $facet) {
         if (strpos($facet[key($facet)], "|") !== false) {
             $filters[key($facet)][] = array('range' => explode('|', $facet[key($facet)]));
         } else {
             $filters[key($facet)][] = $facet[key($facet)];
         }
     }
     foreach ($filters as $name => $value) {
         if (is_array($value[0])) {
             foreach ($value as $range) {
                 $rangeFilters->addField($name, array('gte' => $range['range'][0], 'lte' => $range['range'][1]));
                 $boolFilter->addShould($rangeFilters);
             }
         } else {
             $termFilters = new \Elastica\Filter\Terms();
             $termFilters->setTerms($name, $value);
             $boolFilter->addShould($termFilters);
         }
     }
     $elasticaQuery->setFilter($boolFilter);
     return array($termFilters, $rangeFilters, $boolFilter, $filters);
 }