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); }