Пример #1
0
 public function testTypeInsideHasChildSearch()
 {
     $index = $this->prepareSearchData();
     $f = new \Elastica\Query\Match();
     $f->setField('alt.name', 'testname');
     $filter = new HasChild($f, 'child');
     $searchQuery = new \Elastica\Query();
     $searchQuery->setPostFilter($filter);
     $searchResults = $index->search($searchQuery);
     $this->assertEquals(1, $searchResults->count());
     $result = $searchResults->current()->getData();
     $expected = array('id' => 'parent2', 'user' => 'parent2', 'email' => '*****@*****.**');
     $this->assertEquals($expected, $result);
 }
Пример #2
0
 /**
  * @group functional
  */
 public function testQueryInsideHasParentSearch()
 {
     $index = $this->prepareSearchData();
     $f = new \Elastica\Query\Term();
     $f->setTerm('user', 'parent1');
     $filter = new HasParent($f, 'parent');
     $searchQuery = new \Elastica\Query();
     $searchQuery->setPostFilter($filter);
     $searchResults = $index->search($searchQuery);
     $this->assertEquals(1, $searchResults->count());
     $result = $searchResults->current()->getData();
     $expected = array('id' => 'child1', 'user' => 'child1', 'email' => '*****@*****.**');
     $this->assertEquals($expected, $result);
 }
 private function show($filter = null)
 {
     $query = new \Elastica\Query();
     if ($filter) {
         $query->setPostFilter($filter);
     }
     // WHAT ARE YOU DOING TRACKING MORE THAN 5000 INDEXES?!?
     $query->setSize(5000);
     $res = $this->getType()->getIndex()->search($query);
     foreach ($res as $r) {
         $data = $r->getData();
         $this->outputIndented("index name: " . $r->getId() . "\n");
         $this->outputIndented("  analysis version: {$data['analysis_maj']}.{$data['analysis_min']}\n");
         $this->outputIndented("  mapping version: {$data['mapping_maj']}.{$data['mapping_min']}\n");
         $this->outputIndented("  shards: {$data['shard_count']}\n");
     }
 }
Пример #4
0
 public function testFilter()
 {
     $index = $this->_createIndex('geohash_filter_test');
     $type = $index->getType('test');
     $mapping = new \Elastica\Type\Mapping($type, array('pin' => array('type' => 'geo_point', 'geohash' => true, 'geohash_prefix' => true)));
     $type->setMapping($mapping);
     $type->addDocument(new \Elastica\Document(1, array('pin' => '9q8yyzm0zpw8')));
     $type->addDocument(new \Elastica\Document(2, array('pin' => '9mudgb0yued0')));
     $index->refresh();
     $filter = new GeohashCell('pin', array('lat' => 32.828326, 'lon' => -117.255854));
     $query = new \Elastica\Query();
     $query->setPostFilter($filter);
     $results = $type->search($query);
     $this->assertEquals(1, $results->count());
     //test precision parameter
     $filter = new GeohashCell('pin', '9', 1);
     $query = new \Elastica\Query();
     $query->setPostFilter($filter);
     $results = $type->search($query);
     $this->assertEquals(2, $results->count());
     $index->delete();
 }
Пример #5
0
 public function AetUserSearch($searchText)
 {
     //$finder = $this->container->get('fos_elastica.finder.aetsite.aetusers');
     $baseQuery = new \Elastica\Query();
     $boolQuery = new \Elastica\Query\Bool();
     if (strlen($searchText) == 4 && ctype_digit($searchText)) {
         // Your Convert logic
         $boolFilter = new \Elastica\Filter\Bool();
         $from = new \DateTime('01/01/' . $searchText);
         $to = new \DateTime('12/31/' . $searchText);
         $boolFilter->addMust(new \Elastica\Filter\Range('promotion', array('gte' => \Elastica\Util::convertDate($from->getTimestamp()), 'lte' => \Elastica\Util::convertDate($to->getTimestamp()))));
         $baseQuery->setPostFilter($boolFilter);
     } else {
         $fieldQuery = new \Elastica\Query\Match();
         $fieldQuery->setFieldQuery('firstname', $searchText);
         //$fieldQuery->setFieldParam('title', 'analyzer', 'custom_search_analyzer');
         $boolQuery->addShould($fieldQuery);
         $field1Query = new \Elastica\Query\Match();
         $field1Query->setFieldQuery('lastname', $searchText);
         $boolQuery->addShould($field1Query);
         $field1Query = new \Elastica\Query\Match();
         $field1Query->setFieldQuery('pays', $searchText);
         $boolQuery->addShould($field1Query);
         $field1Query = new \Elastica\Query\Match();
         $field1Query->setFieldQuery('ville', $searchText);
         $boolQuery->addShould($field1Query);
         $field1Query = new \Elastica\Query\Match();
         $field1Query->setFieldQuery('codePostale', $searchText);
         $boolQuery->addShould($field1Query);
         $field1Query = new \Elastica\Query\Match();
         $field1Query->setFieldQuery('activitePrincipale', $searchText);
         $boolQuery->addShould($field1Query);
         $baseQuery->setQuery($boolQuery);
     }
     // Option 1. Returns all users who have example.net in any of their mapped fields
     return $this->find($baseQuery);
 }
Пример #6
0
 public function testLookup()
 {
     $index = $this->_createIndex('terms_filter_test');
     $type1 = $index->getType('musicians');
     $type2 = $index->getType('bands');
     //index some test data
     $type1->addDocument(new \Elastica\Document(1, array('name' => 'robert', 'lastName' => 'plant')));
     $type1->addDocument(new \Elastica\Document(2, array('name' => 'jimmy', 'lastName' => 'page')));
     $type1->addDocument(new \Elastica\Document(3, array('name' => 'john paul', 'lastName' => 'jones')));
     $type1->addDocument(new \Elastica\Document(4, array('name' => 'john', 'lastName' => 'bonham')));
     $type1->addDocument(new \Elastica\Document(5, array('name' => 'jimi', 'lastName' => 'hendrix')));
     $type2->addDocument(new \Elastica\Document('led zeppelin', array('members' => array('plant', 'page', 'jones', 'bonham'))));
     $index->refresh();
     //use the terms lookup feature to query for some data
     $termsFilter = new Terms();
     $termsFilter->setLookup('lastName', $type2, 'led zeppelin', 'members', NULL);
     $query = new \Elastica\Query();
     $query->setPostFilter($termsFilter);
     $results = $index->search($query);
     $this->assertEquals($results->count(), 4, 'Terms lookup with null index');
     $termsFilter->setLookup('lastName', $type2, 'led zeppelin', 'members', $index);
     $query->setPostFilter($termsFilter);
     $results = $index->search($query);
     $this->assertEquals($results->count(), 4, 'Terms lookup with index as object');
     //Query with index given as string
     $termsFilter->setLookup('lastName', $type2, 'led zeppelin', 'members', $index->getName());
     $query->setPostFilter($termsFilter);
     $results = $index->search($query);
     $this->assertEquals($results->count(), 4, 'Terms lookup with index as string');
     //Query with array of options
     $termsFilter->setLookup('lastName', $type2, 'led zeppelin', 'members', array('index' => $index, 'cache' => false));
     $query->setPostFilter($termsFilter);
     $results = $index->search($query);
     $this->assertEquals($results->count(), 4, 'Terms lookup with options array');
     $index->delete();
 }
Пример #7
0
 /**
  * @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);
 }
Пример #8
0
 public function searchSample($criteria, $dataset, $sorts = array(), $operator = 'OR')
 {
     /*if($limit <= 0) {
           $limit = Yii::app()->params['es_search']['limits']['default'];
       }*/
     $keyword = $criteria['keyword'];
     $eQueryString = new \Elastica\Query\QueryString();
     $eQueryString->setDefaultOperator($operator);
     $eQueryString->setQuery($keyword);
     $eQuery = new \Elastica\Query();
     $eQuery->setQuery($eQueryString);
     //$eQuery->setFrom($offset);
     //$eQuery->setLimit($limit);
     $filterAnd = new \Elastica\Filter\BoolAnd();
     if (isset($criteria['common_name'])) {
         $filterAnd->addFilter($this->newTerms('common_name', $criteria['common_name']));
     }
     if (is_array($dataset) && !empty($dataset)) {
         $ids = new \Elastica\Filter\Ids();
         $ids->setIds($dataset);
         $filterAnd->addFilter($ids);
     }
     $arrayAnd = $filterAnd;
     $arrayAnd = $arrayAnd->toArray();
     if (count($arrayAnd['and']) > 0) {
         $eQuery->setPostFilter($filterAnd);
     }
     $sortList = array_merge(array('_score' => array('order' => 'desc')), $sorts);
     $eQuery->setSort($sortList);
     $index = Yii::app()->elastic->client->getIndex('gigadb');
     $type = $index->getType('sample');
     $eResultSet = $type->search($eQuery);
     $results = $eResultSet->getResults();
     $total = $eResultSet->getTotalHits();
     $data = array();
     foreach ($results as $result) {
         if ($result) {
             $data[] = $result->getData();
         }
     }
     $re = array('data' => $data, 'total' => $total);
     //Yii::log(print_r($re, true), 'debug');
     return $re;
 }
Пример #9
0
 /**
  * @SWG\Api(
  *   path="/posts/search",
  *   @SWG\Operation(
  *     method="POST",
  *     summary="Search items in posts",
  *     nickname="posts_search",
  *      @SWG\Parameter(
  *           name="post_type",
  *           required=false,
  *           type="string"
  *         ),
  *      @SWG\Parameter(
  *           name="filters",
  *           description="filter values, eg. [{my_parameter: 'mustmatchthis'}]
  *           required=false,
  *           type="array[]"
  *         ),
  *      @SWG\Parameter(
  *           name="search_phrase",
  *           required=false,
  *           type="string"
  *         ),
  *      @SWG\Parameter(
  *           name="sort",
  *           description="sort configuration, eg [{'post_name':{'order':'asc'}}]",
  *           required=false,
  *           type="array[]"
  *         ),
  *      @SWG\Parameter(
  *           name="limit",
  *           description="Max number of documents in return",
  *           required=false,
  *           type="integer"
  *         )
  *   )
  * )
  */
 function search()
 {
     $result = array();
     $body = $this->getBodyAsArray();
     $required_parameters = array();
     $optional_parameters = array('post_type', 'filters', 'search_phrase', 'sort', 'limit', 'size', 'from');
     $this->check_req_opt_param($required_parameters, $optional_parameters, $body);
     $index = $this->elastica->getIndex($this->getElasticsearchIndex());
     $query = new \Elastica\Query();
     $boolean = new \Elastica\Query\Bool();
     $added = false;
     $type = isset($body['post_type']) ? $body['post_type'] : null;
     if ($type) {
         $q = new \Elastica\Query\Term(array('_type' => $type));
         $boolean->addMust($q);
         $added = true;
     }
     $filters = isset($body['filters']) ? (array) $body['filters'] : array();
     $filters = array_filter($filters);
     $filterAnd = '';
     if ($filters) {
         foreach ($filters as $key => $vals) {
             if (!is_array($vals)) {
                 $vals = array($vals);
             }
             if (strpos(implode('', $vals), '*')) {
                 foreach ($vals as $val) {
                     $extraQuery = new \Elastica\Query\SimpleQueryString($val, array($key));
                     $boolean->addMust($extraQuery);
                 }
             } else {
                 $filterOr = new \Elastica\Filter\BoolOr();
                 foreach ($vals as $val) {
                     $filter = new \Elastica\Filter\Term();
                     $filter->setTerm($key, $val);
                     $filterOr->addFilter($filter);
                 }
                 if (!$filterAnd) {
                     $filterAnd = new \Elastica\Filter\BoolAnd();
                 }
                 $filterAnd->addFilter($filterOr);
             }
         }
     }
     $search_phrase = isset($body['search_phrase']) ? $body['search_phrase'] : null;
     if (isset($search_phrase) && !empty($search_phrase)) {
         $word = strtolower($search_phrase) . '*';
         $elasticaQueryString = new \Elastica\Query\SimpleQueryString($word);
         $boolean->addMust($elasticaQueryString);
         $added = true;
     }
     if ($added) {
         $query->setQuery($boolean);
     }
     if ($filterAnd) {
         $query->setPostFilter($filterAnd);
     }
     $limit = isset($body['limit']) ? (int) $body['limit'] : null;
     if ($limit) {
         $query->setSize($limit);
     }
     $sort = isset($body['sort']) ? (array) $body['sort'] : null;
     if ($sort) {
         $query->setSort($sort);
         // example: array( 'post_date' => array( 'order' => 'desc' ) )
     }
     $body['from'] = isset($body['from']) && $body['from'] ? $body['from'] : 0;
     $body['size'] = isset($body['size']) && $body['size'] ? $body['size'] : 1000;
     $elasticaResultSet = $index->search($query, ['from' => $body['from'], 'size' => $body['size']]);
     foreach ($elasticaResultSet->getResults() as $elasticaResult) {
         $result[] = $elasticaResult->getData();
     }
     echo json_encode(array('hits' => $result, 'count' => $index->count($query)));
 }
 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());
     }
 }