Пример #1
1
 /**
  * {@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));
 }
Пример #4
0
 /**
  * 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());
     }
 }