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); }
/** * @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"); } }
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(); }
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); }
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(); }
/** * @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); }
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; }
/** * @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()); } }