public function testSearch() { $client = new Elastica_Client(); $index = new Elastica_Index($client, 'test'); $index->create(array(), true); $type = new Elastica_Type($index, 'helloworld'); $doc = new Elastica_Document(1, array('id' => 1, 'email' => '*****@*****.**', 'username' => 'hans', 'test' => array('2', '3', '5'))); $type->addDocument($doc); $doc = new Elastica_Document(2, array('id' => 2, 'email' => '*****@*****.**', 'username' => 'emil', 'test' => array('1', '3', '6'))); $type->addDocument($doc); $doc = new Elastica_Document(3, array('id' => 3, 'email' => '*****@*****.**', 'username' => 'ruth', 'test' => array('2', '3', '7'))); $type->addDocument($doc); // Refresh index $index->refresh(); $boolQuery = new Elastica_Query_Bool(); $termQuery1 = new Elastica_Query_Term(array('test' => '2')); $boolQuery->addMust($termQuery1); $resultSet = $type->search($boolQuery); $this->assertEquals(2, $resultSet->count()); $termQuery2 = new Elastica_Query_Term(array('test' => '5')); $boolQuery->addMust($termQuery2); $resultSet = $type->search($boolQuery); $this->assertEquals(1, $resultSet->count()); $termQuery3 = new Elastica_Query_Term(array('username' => 'hans')); $boolQuery->addMust($termQuery3); $resultSet = $type->search($boolQuery); $this->assertEquals(1, $resultSet->count()); $termQuery4 = new Elastica_Query_Term(array('username' => 'emil')); $boolQuery->addMust($termQuery4); $resultSet = $type->search($boolQuery); $this->assertEquals(0, $resultSet->count()); }
private function searchCombination(SearchParameterBag $searchParams) { $query = new \Elastica_Query_Text(); $query->setFieldQuery('name', $searchParams->get('term')); $query->setFieldParam('name', 'type', 'phrase_prefix'); $this->results = $this->container->get('foq_elastica.finder.treatments')->find($query); $client = $this->container->get('foq_elastica.client'); $search = new \Elastica_Search($client); $postType = $this->get('foq_elastica.index.acme.post'); $tagType = $this->get('foq_elastica.index.acme.tag'); // add the types to the search $search->addType($postType)->addType($tagType); $index = $this->get('foq_elastica.index'); $search->addIndex($index); $searchTerm = $request->query->get('terms'); $postSubjectQuery = new \Elastica_Query_Text(); $postSubjectQuery->setFieldQuery('subject', $searchTerm); $postSubjectQuery->setFieldParam('subject', 'analyzer', 'snowball'); $tagQuery = new \Elastica_Query_Text(); $tagQuery->setFieldQuery('tagname', $searchTerm); $tagQuery->setFieldParam('tagname', 'analyzer', 'snowball'); $boolQuery = new \Elastica_Query_Bool(); $boolQuery->addShould($nameQuery); $boolQuery->addShould($keywordsQuery); $results = $search->search($boolQuery); return array('results' => $results); }
/** * Handles search and facets. * * @param string $q * @param array $params * @param string $type * @return Elastica_ResultSet * @throws Exception */ public function search($q, $params = array(), $type = 'product') { if ($this->getStatus()->indexExists($this->_index)) { if (empty($params['filters'])) { $params['filters'] = '*'; } $queryFilter = new Elastica_Filter_Query(new Elastica_Query_QueryString($params['filters'])); if (isset($params['range_filters']) && !empty($params['range_filters'])) { $andFilter = new Elastica_Filter_And(); $andFilter->addFilter($queryFilter); $filter = new Elastica_Filter_Range(); foreach ($params['range_filters'] as $field => $rangeFilter) { $filter->addField($field, $rangeFilter); } $andFilter->addFilter($filter); $queryFilter = $andFilter; } if (empty($q)) { $baseQuery = new Elastica_Query_MatchAll(); } else { $baseQuery = new Elastica_Query_Bool(); if ($this->isFuzzyQueryEnabled()) { $fields = $this->_getSearchFields(true, $q); $queryFuzzy = new Elastica_Query_FuzzyLikeThis(); $queryFuzzy->addFields($fields); $queryFuzzy->setLikeText($q); $queryFuzzy->setMinSimilarity($this->getFuzzyMinSimilarity()); $queryFuzzy->setPrefixLength($this->getFuzzyPrefixLength()); $queryFuzzy->setMaxQueryTerms($this->getFuzzyMaxQueryTerms()); $queryFuzzy->setBoost($this->getFuzzyQueryBoost()); $baseQuery->addShould($queryFuzzy); } $queryString = new Elastica_Query_QueryString($q); $queryString->setFields($this->_getSearchFields(false, $q)); $baseQuery->addShould($queryString); } $filteredQuery = new Elastica_Query_Filtered($baseQuery, $queryFilter); $query = Elastica_Query::create($filteredQuery)->setFrom($params['offset'])->setLimit($params['limit']); if (isset($params['facets']['queries']) && !empty($params['facets']['queries'])) { foreach ($params['facets']['queries'] as $facetQuery) { $facet = new Elastica_Facet_Query($facetQuery); $facet->setParam('query_string', array('query' => $facetQuery)); $query->addFacet($facet); } } if (isset($params['stats']['fields']) && !empty($params['stats']['fields'])) { foreach ($params['stats']['fields'] as $field) { $facet = new Elastica_Facet_Statistical($field); $facet->setParam('field', $field); $query->addFacet($facet); } } else { if (isset($params['facets']['fields']) && !empty($params['facets']['fields'])) { $properties = $this->_getIndexProperties(); foreach ($params['facets']['fields'] as $field) { if (array_key_exists($field, $properties)) { $facet = new Elastica_Facet_Terms($field); if ($properties[$field]['type'] == 'multi_field') { $field .= '.untouched'; } $facet->setField($field); $facet->setParam('all_terms', true); $facet->setSize($this->getFacetsMaxSize()); $query->addFacet($facet); } } } if (isset($params['facets']['ranges']) && !empty($params['facets']['ranges'])) { foreach ($params['facets']['ranges'] as $field => $ranges) { $facet = new Elastica_Facet_Range($field); $facet->setField($field); $facet->setRanges($ranges); $query->addFacet($facet); } } } if (isset($params['sort']) && !empty($params['sort'])) { foreach ($params['sort'] as $sort) { $query->addSort($sort); } } $result = $this->getIndex($this->_index)->getType($type)->search($query); return $result; } return array(); }