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);
 }
 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);
 }
 /**
  * @param      $searchTerm
  * @param null $appliedFilters
  * @param      $configuration
  * @param      $preSearchTaxonFilter
  * @param      $types
  *
  * @return mixed
  */
 public function compileElasticSearchStringQuery($searchTerm, $appliedFilters = null, $configuration, $preSearchTaxonFilter, $types = null)
 {
     $elasticaQuery = new \Elastica\Query();
     $boolFilter = new \Elastica\Filter\BoolFilter();
     $query = new \Elastica\Query\QueryString($searchTerm);
     if (!empty($types)) {
         foreach ($types as $type) {
             $typeFilter = new \Elastica\Filter\Type($type);
             $boolFilter->addMust($typeFilter);
         }
         $elasticaQuery->setPostFilter($boolFilter);
     }
     if ($channel = $this->channelContext->getChannel()) {
         $channelFilter = new \Elastica\Filter\Terms();
         $channelFilter->setTerms('channels', array((string) $channel));
         $boolFilter->addMust($channelFilter);
         $elasticaQuery->setPostFilter($boolFilter);
     }
     // this is currently the only pre search filter and it's a taxon
     // this should be abstracted out if other types of pre search filters are desired
     if ('all' !== $preSearchTaxonFilter) {
         $query = new \Elastica\Query\Filtered();
         $query->setQuery(new \Elastica\Query\QueryString($searchTerm));
         $taxonFromRequestFilter = new \Elastica\Filter\Terms();
         $taxonFromRequestFilter->setTerms('taxons', array($preSearchTaxonFilter));
         $boolFilter->addMust($taxonFromRequestFilter);
         $elasticaQuery->setPostFilter($boolFilter);
     }
     $elasticaQuery->setQuery($query);
     return $this->compileElasticsearchQuery($elasticaQuery, $appliedFilters, $configuration);
 }