public function searchArtistAction(Request $request) { $query = $request->get('query', null); // notre index est directement disponible sous forme de service $index = $this->container->get('fos_elastica.index.wte.artiste'); $searchQuery = new \Elastica\Query\QueryString(); $searchQuery->setParam('query', $query); // nous forçons l'opérateur de recherche à AND, car on veut les résultats qui // correspondent à tous les mots de la recherche, plutôt qu'à au moins un // d'entre eux (opérateur OR) $searchQuery->setDefaultOperator('AND'); // on exécute une requête de type "fields", qui portera sur les colonnes "name" $searchQuery->setParam('fields', array('prenom')); // exécution de la requête, limitée aux 20 premiers résultats $results = $index->search($searchQuery, 20)->getResults(); $data = array(); // on arrange les données des résultats... foreach ($results as $result) { $source = $result->getSource(); $data[] = array('id' => $source['id'], 'name' => $source['prenom']); } return new JsonResponse($data, 200, array('Cache-Control' => 'no-cache')); }
/** * Builds a query based on QueryString syntax * @param array $fields the fields * @param string $queryString the query * @param integer $phraseSlop phrase slop * @param string $defaultOperator the default operator AND or OR * @return \Elastica\Query\QueryString */ public function buildQueryString(array $fields, $queryString, $phraseSlop, $defaultOperator = 'AND') { $query = new \Elastica\Query\QueryString($queryString); $query->setFields($fields); $query->setAutoGeneratePhraseQueries(true); $query->setPhraseSlop($phraseSlop); $query->setDefaultOperator($defaultOperator); $query->setAllowLeadingWildcard($this->context->isAllowLeadingWildcards()); $query->setFuzzyPrefixLength(2); $query->setRewrite('top_terms_boost_1024'); $states = $this->context->getConfig()->get('CirrusSearchQueryStringMaxDeterminizedStates'); if (isset($states)) { // Requires ES 1.4+ $query->setParam('max_determinized_states', $states); } return $query; }