/** * {@inheritdoc} */ public function findUser($token) { $query = new \Elastica\Query\Fuzzy(); $query->setField('username', $token); $finalQuery = new \Elastica\Query($query); $finalQuery->setFields(['username', 'profilePicture']); $finalQuery->setHighlight(['pre_tags' => ['<em style="color: #FF66FF;">'], 'post_tags' => ['</em>'], 'fields' => ['username' => ['fragment_size' => 200, 'number_of_fragments' => 1]]]); $users = $this->finder->search($finalQuery); $results = []; foreach ($users as $user) { $results[] = ['username' => $user->getData()['username'][0], 'profilePicture' => $user->getData()['profilePicture'][0], 'highlights' => $user->getHighlights()['username'][0]]; } return $results; }
<?php ini_set("display_errors", true); require_once __DIR__ . '/../vendor/autoload.php'; $client = new \Elastica\Client(); $search = new Elastica\Search($client); $search->addIndex('comicbook')->addType('superhero'); $query = new Elastica\Query(); $query->setSize(10)->setSort(['name' => 'asc']); $searchText = "Kent"; $stringQuery = new Elastica\Query\QueryString($searchText); $query->setQuery($stringQuery); $query->setHighlight(array('pre_tags' => array('<strong>'), 'post_tags' => array('</strong>'), 'fields' => array('name' => array('force_source' => true), 'summary' => array('force_source' => true)))); $search->setQuery($query); $resultSet = $search->search(); echo 'Search "' . $searchText . '"<br />' . PHP_EOL; echo 'Founded ' . $resultSet->getTotalHits() . ' records in ' . $resultSet->getTotalTime() . 'ms<br /><br />' . PHP_EOL; foreach ($resultSet as $result) { $data = $result->getData(); foreach ($result->getHighlights() as $key => $value) { $data[$key] = join(PHP_EOL, $value); } echo $data['name'] . ' - ' . $data['summary'] . "<br /><br />" . PHP_EOL; }
public function searchAction(Request $request, $page) { $term = $request->get('q'); if (strlen($term) === 0) { return $this->redirectToRoute('blog_index'); } $finder = $this->container->get('fos_elastica.finder.app.post'); $queryString = new \Elastica\Query\QueryString(); $queryString->setDefaultField('_all'); $queryString->setQuery($term); $query = new \Elastica\Query($queryString); $query->setSize(50); $query->setHighlight(array('fields' => array('*' => new \stdClass()))); $elasticaSearchResults = $finder->findHybrid($query); $searchResults = array(); $serializer = $this->get('serializer'); foreach ($elasticaSearchResults as $elasticaSearchResult) { $resultJson = $serializer->serialize($elasticaSearchResult->getTransformed(), 'json'); $resultObj = json_decode($resultJson, true); foreach ($elasticaSearchResult->getResult()->getHit()['highlight'] as $key => $value) { if ($key !== 'slug') { $resultObj[$key] = current($value); } } array_push($searchResults, $resultObj); } return $this->render('ElasticSearchBundle::elastica_search_results.html.twig', array('term' => $term, 'results' => $searchResults)); }
/** * Main method to make a search */ public function search() { $this->getSearchFields(); $word = JRequest::getString('searchword', null, 'get'); $offset = JRequest::getInt('start', 0, 'get'); $limit = JRequest::getInt('limit', 10, 'get'); if ($limit == 0) { // no limit $limit = 10000; } $this->getSearchAreas(); $elasticaQueryString = new \Elastica\Query\QueryString(); // Log search word only on the first page if ($offset == 0) { SearchHelper::logSearch($word); } // Convert accents $word = htmlentities($word, ENT_NOQUOTES, 'utf-8'); $word = preg_replace('#\\&([A-za-z])(?:uml|circ|tilde|acute|grave|cedil|ring)\\;#', '\\1', $word); $word = preg_replace('#\\&([A-za-z]{2})(?:lig)\\;#', '\\1', $word); $word = preg_replace('#\\&[^;]+\\;#', '', $word); // Check if there are quotes ( for exact search ) $exactSearch = false; if (strlen($word) > 1 && $word[0] == '"' && $word[strlen($word) - 1] == '"') { $exactSearch = true; $word = substr($word, 1, strlen($word) - 2); // Remove external " } $word = Elastica\Util::replaceBooleanWordsAndEscapeTerm($word); // Escape ElasticSearch specials char if ($exactSearch) { $word = '"' . $word . '"'; } if ($word == "") { $word = "*"; } $elasticaQueryString->setQuery($word); //Create the actual search object with some data. $elasticaQuery = new Elastica\Query(); $elasticaQuery->setQuery($elasticaQueryString); if (ElasticSearchConfig::getHighLigthEnable()) { $fields = $this->getHighlightFields(); $hlfields = array(); foreach ($fields as $field) { foreach ($field as $highlight) { $hlfields[] = array($highlight => array('fragment_size' => 1000, 'number_of_fragments' => 1)); } } $highlightFields = array('pre_tags' => array(ElasticSearchConfig::getHighLigthPre()), 'post_tags' => array(ElasticSearchConfig::getHighLigthPost()), "order" => "score", 'fields' => $hlfields); $elasticaQuery->setHighlight($highlightFields); } // Set offset and limit for pagination $elasticaQuery->setFrom($offset); $elasticaQuery->setLimit($limit); //Create a filter for _type $elasticaFilterype = $this->createFilterType($this->areas); // Add filter to the search object. $elasticaQuery->setFilter($elasticaFilterype); //Search on the index. $elasticaResultSet = $this->elasticaIndex->search($elasticaQuery); $this->results = $elasticaResultSet->getResults(); $this->totalHits = $elasticaResultSet->getTotalHits(); }
/** * @param $queryString * @param int $offset * @param int $limit * @return null|SugarSeachEngineElasticResultSet */ public function search($queryString, $offset = 0, $limit = 20, $options = array()) { if (self::isSearchEngineDown()) { return null; } $appendWildcard = false; if (!empty($options['append_wildcard']) && $this->canAppendWildcard($queryString)) { $appendWildcard = true; } $queryString = DBManagerFactory::getInstance()->sqlLikeString($queryString, self::WILDCARD_CHAR, $appendWildcard); $this->logger->info("Going to search with query {$queryString}"); $results = null; try { $queryObj = $this->buildQueryObject($queryString, $options); $s = new \Elastica\Search($this->_client); $finalTypes = array(); if (!empty($options['moduleFilter'])) { foreach ($options['moduleFilter'] as $moduleName) { // only add the module to the list if it can be viewed if ($this->checkAccess($moduleName)) { $finalTypes[] = $moduleName; } } if (!empty($finalTypes)) { $s->addTypes($finalTypes); } } $s->addIndices($this->getReadIndices($finalTypes)); // main filter $mainFilter = $this->constructMainFilter($finalTypes, $options); $query = new \Elastica\Query($queryObj); $query->setFilter($mainFilter); if (isset($options['sort']) && is_array($options['sort'])) { foreach ($options['sort'] as $sort) { $query->addSort($sort); } } $query->setParam('from', $offset); // set query highlight $fields = $this->getSearchFields($options, false); $highlighArray = $this->constructHighlightArray($fields, $options); $query->setHighlight($highlighArray); // add facets $this->addFacets($query, $options, $mainFilter); $esResultSet = $s->search($query, $limit); $results = new SugarSeachEngineElasticResultSet($esResultSet); } catch (Exception $e) { $this->reportException("Unable to perform search", $e); $this->checkException($e); return null; } return $results; }
public function search($queryString, $opts, $highlight) { $query = new \Elastica\Query(); list($searchQuery, $highlights) = $this->parseQueryString($queryString, $opts); $query->setQuery($searchQuery); $language = new \Elastica\Facet\Terms('language'); $language->setField('language'); $language->setSize(500); $query->addFacet($language); $group = new \Elastica\Facet\Terms('group'); $group->setField('group'); // Would like to prioritize the top level groups and not show subgroups // if the top group has only few hits, but that doesn't seem to be possile. $group->setSize(500); $query->addFacet($group); $query->setSize($opts['limit']); $query->setFrom($opts['offset']); // BoolAnd filters are executed in sequence per document. Bool filters with // multiple must clauses are executed by converting each filter into a bit // field then anding them together. The latter is normally faster if either // of the subfilters are reused. May not make a difference in this context. $filters = new \Elastica\Filter\Bool(); $language = $opts['language']; if ($language !== '') { $languageFilter = new \Elastica\Filter\Term(); $languageFilter->setTerm('language', $language); $filters->addMust($languageFilter); } $group = $opts['group']; if ($group !== '') { $groupFilter = new \Elastica\Filter\Term(); $groupFilter->setTerm('group', $group); $filters->addMust($groupFilter); } // Check that we have at least one filter to avoid invalid query errors. if ($language !== '' || $group !== '') { $query->setPostFilter($filters); } list($pre, $post) = $highlight; $query->setHighlight(array('pre_tags' => array($pre), 'post_tags' => array($post), 'fields' => $highlights)); try { return $this->getType()->getIndex()->search($query); } catch (\Elastica\Exception\ExceptionInterface $e) { throw new TTMServerException($e->getMessage()); } }