Автор: Nicolas Ruflin (spam@ruflin.com)
Наследование: extends AbstractQuery
 /**
  * @group functional
  */
 public function testSearchByDocument()
 {
     $client = $this->_getClient(array('persistent' => false));
     $index = $client->getIndex('elastica_test');
     $index->create(array('index' => array('number_of_shards' => 1, 'number_of_replicas' => 0)), true);
     $type = new Type($index, 'mlt_test');
     $type->addDocuments(array(new Document(1, array('visible' => true, 'name' => 'bruce wayne batman')), new Document(2, array('visible' => true, 'name' => 'bruce wayne')), new Document(3, array('visible' => false, 'name' => 'bruce wayne')), new Document(4, array('visible' => true, 'name' => 'batman')), new Document(5, array('visible' => false, 'name' => 'batman')), new Document(6, array('visible' => true, 'name' => 'superman')), new Document(7, array('visible' => true, 'name' => 'spiderman'))));
     $index->refresh();
     $doc = $type->getDocument(1);
     // Return all similar from id
     $mltQuery = new MoreLikeThis();
     $mltQuery->setMinTermFrequency(1);
     $mltQuery->setMinDocFrequency(1);
     $mltQuery->setLike($doc);
     $query = new Query($mltQuery);
     $resultSet = $type->search($query);
     $this->assertEquals(4, $resultSet->count());
     $mltQuery = new MoreLikeThis();
     $mltQuery->setMinTermFrequency(1);
     $mltQuery->setMinDocFrequency(1);
     $mltQuery->setLike($doc);
     $query = new Query\BoolQuery();
     $query->addMust($mltQuery);
     $this->hideDeprecated();
     // Return just the visible similar from id
     $filter = new Query\BoolQuery();
     $filterTerm = new Query\Term();
     $filterTerm->setTerm('visible', true);
     $filter->addMust($filterTerm);
     $query->addFilter($filter);
     $this->showDeprecated();
     $resultSet = $type->search($query);
     $this->assertEquals(2, $resultSet->count());
     // Return all similar from source
     $mltQuery = new MoreLikeThis();
     $mltQuery->setMinTermFrequency(1);
     $mltQuery->setMinDocFrequency(1);
     $mltQuery->setMinimumShouldMatch(90);
     $mltQuery->setLike($type->getDocument(1)->setId(''));
     $query = new Query($mltQuery);
     $resultSet = $type->search($query);
     $this->assertEquals(1, $resultSet->count());
     // Legacy test with filter
     $mltQuery = new MoreLikeThis();
     $mltQuery->setMinTermFrequency(1);
     $mltQuery->setMinDocFrequency(1);
     $mltQuery->setLike($doc);
     $query = new Query\BoolQuery();
     $query->addMust($mltQuery);
     $this->hideDeprecated();
     // Return just the visible similar
     $filter = new BoolFilter();
     $filterTerm = new Term();
     $filterTerm->setTerm('visible', true);
     $filter->addMust($filterTerm);
     $query->addFilter($filter);
     $this->showDeprecated();
     $resultSet = $type->search($query);
     $this->assertEquals(2, $resultSet->count());
 }
 /**
  * @param RelationDefinition $query
  * @param string $lang
  * @param string $type
  *
  * @return void
  */
 public function defineSearch($query, $lang, $type)
 {
     $category = $query->getCategory();
     $tags = $query->getTags();
     $exclude = $query->getExclude();
     $rootNode = $this->domainConfiguration->getRootNode();
     $bool = (new Query\BoolQuery())->setMinimumNumberShouldMatch(1);
     $bool->addMust((new Term())->setTerm('lang', $this->language));
     $bool->addMust((new Term())->setTerm('type', $type));
     $bool->addMust((new Term())->setTerm('view_roles', 'IS_AUTHENTICATED_ANONYMOUSLY'));
     if ($rootNode instanceof Node) {
         $root = new Term();
         $root->setTerm('root_id', $rootNode->getId());
         $bool->addMust($root);
     }
     // check if slug is non-empty: avoid filtering for home page
     if ($category && $category->getSlug()) {
         $bool->addShould((new Term())->setTerm('ancestors', $category->getNodeId()));
     }
     if ($tags) {
         $tagLogic = $this->tagsLogic instanceof TagLogic ?: new TagLogic(TagLogic::LOGIC_FEW);
         $minimum = $tagLogic->getMinMatch($tags);
         $bool->addShould((new Terms())->setMinimumMatch($minimum)->setTerms('tags', $tags));
     }
     if (0 !== sizeof($exclude)) {
         $bool->addMustNot((new Terms())->setTerms('node_id', $exclude));
     }
     $this->query = new Query();
     $queryDefinition = new QueryDefinition($this->query, $bool);
     $this->feed->modifyQuery($queryDefinition);
     $queryDefinition->getQuery()->setQuery($queryDefinition->getFilterQuery());
 }
Пример #3
0
 /**
  * Test to resolve the following issue.
  *
  * @link https://groups.google.com/forum/?fromgroups#!topic/elastica-php-client/zK_W_hClfvU
  *
  * @group unit
  */
 public function testToArrayStructure()
 {
     $boolQuery = new BoolQuery();
     $term1 = new Term();
     $term1->setParam('interests', 84);
     $term2 = new Term();
     $term2->setParam('interests', 92);
     $boolQuery->addShould($term1)->addShould($term2);
     $jsonString = '{"bool":{"should":[{"term":{"interests":84}},{"term":{"interests":92}}]}}';
     $this->assertEquals($jsonString, json_encode($boolQuery->toArray()));
 }
 public function testToArray()
 {
     $query = new Term();
     $key = 'name';
     $value = 'nicolas';
     $boost = 2;
     $query->setTerm($key, $value, $boost);
     $data = $query->toArray();
     $this->assertInternalType('array', $data['term']);
     $this->assertInternalType('array', $data['term'][$key]);
     $this->assertEquals($data['term'][$key]['value'], $value);
     $this->assertEquals($data['term'][$key]['boost'], $boost);
 }
Пример #5
0
 /**
  * Perform a search on messages using Elasticsearch
  *
  * @param  string    $query The query string
  * @return Message[] The results of the search
  */
 private function elasticSearch($query)
 {
     $finder = \Service::getContainer()->get('fos_elastica.finder.search');
     $boolQuery = new Bool();
     // We have only stored "active" messages and groups on Elasticsearch's
     // database, so there is no check for that again
     if ($this->player) {
         // Make sure that the parent of the message (i.e. the group that the
         // message belongs into) has the current player as its member
         $recipientQuery = new Term();
         $recipientQuery->setTerm('members', $this->player->getId());
         $parentQuery = new HasParent($recipientQuery, 'group');
         $boolQuery->addMust($parentQuery);
     }
     $fieldQuery = new Match();
     $fieldQuery->setFieldQuery('content', $query)->setFieldFuzziness('content', 'auto');
     $boolQuery->addMust($fieldQuery);
     return $finder->find($boolQuery);
 }
 /**
  * @group functional
  */
 public function testQuery()
 {
     $query = new Query();
     $match = new Match();
     $match->setField('make', 'ford');
     $query->setQuery($match);
     $filter = new Query\Term();
     $filter->setTerm('color', 'green');
     $query->setPostFilter($filter);
     $results = $this->_getTestIndex()->search($query);
     $this->assertEquals(1, $results->getTotalHits());
 }
Пример #7
0
 /**
  * @group unit
  */
 public function testSetQueryToArrayChangeQuery()
 {
     $query = new Query();
     $termQuery = new Term();
     $termQuery->setTerm('text', 'value');
     $query->setQuery($termQuery);
     $queryArray = $query->toArray();
     $termQuery = $query->getQuery();
     $termQuery->setTerm('text', 'another value');
     $this->assertNotEquals($queryArray, $query->toArray());
 }
Пример #8
0
 /**
  * @group functional
  */
 public function testGlobalSearchTypeSearchWithKeys()
 {
     $type = $this->_createType();
     $index = $type->getIndex();
     $client = $index->getClient();
     $multiSearch = new MultiSearch($client);
     $search1 = new Search($client);
     $search1->addIndex($index)->addType($type);
     $query1 = new Query();
     $termQuery1 = new Term();
     $termQuery1->setTerm('username', 'farrelley');
     $query1->setQuery($termQuery1);
     $query1->setSize(2);
     $search1->setQuery($query1);
     $multiSearch->addSearch($search1);
     $this->assertCount(1, $multiSearch->getSearches());
     $search2 = new Search($client);
     $search2->addIndex($index)->addType($type);
     $query2 = new Query();
     $termQuery2 = new Term();
     $termQuery2->setTerm('username', 'bunny');
     $query2->setQuery($termQuery2);
     $query2->setSize(3);
     $search2->setQuery($query2);
     $multiSearch->addSearch($search2);
     $multiSearch->setSearchType(Search::OPTION_SEARCH_TYPE_COUNT);
     $multiResultSet = $multiSearch->search();
     $this->assertInstanceOf('Elastica\\Multi\\ResultSet', $multiResultSet);
     $this->assertCount(2, $multiResultSet);
     $this->assertInstanceOf('Elastica\\Response', $multiResultSet->getResponse());
     $resultSets = $multiResultSet->getResultSets();
     $this->assertInternalType('array', $resultSets);
     $this->assertArrayHasKey(0, $resultSets);
     $this->assertInstanceOf('Elastica\\ResultSet', $resultSets[0]);
     $this->assertCount(0, $resultSets[0]);
     $this->assertSame($query1, $resultSets[0]->getQuery());
     $this->assertEquals(3, $resultSets[0]->getTotalHits());
     $this->assertArrayHasKey(1, $resultSets);
     $this->assertInstanceOf('Elastica\\ResultSet', $resultSets[1]);
     $this->assertCount(0, $resultSets[1]);
     $this->assertSame($query2, $resultSets[1]->getQuery());
     $this->assertEquals(6, $resultSets[1]->getTotalHits());
     $search1->setOption(Search::OPTION_SEARCH_TYPE, Search::OPTION_SEARCH_TYPE_QUERY_AND_FETCH);
     $multiResultSet = $multiSearch->search();
     $this->assertInstanceOf('Elastica\\Multi\\ResultSet', $multiResultSet);
     $this->assertCount(2, $multiResultSet);
     $this->assertInstanceOf('Elastica\\Response', $multiResultSet->getResponse());
     $resultSets = $multiResultSet->getResultSets();
     $this->assertInternalType('array', $resultSets);
     $this->assertArrayHasKey(0, $resultSets);
     $this->assertInstanceOf('Elastica\\ResultSet', $resultSets[0]);
     $this->assertCount(2, $resultSets[0]);
     $this->assertSame($query1, $resultSets[0]->getQuery());
     $this->assertEquals(3, $resultSets[0]->getTotalHits());
     $this->assertArrayHasKey(1, $resultSets);
     $this->assertInstanceOf('Elastica\\ResultSet', $resultSets[1]);
     $this->assertCount(0, $resultSets[1]);
     $this->assertSame($query2, $resultSets[1]->getQuery());
     $this->assertEquals(6, $resultSets[1]->getTotalHits());
 }
Пример #9
0
 /**
  * Find a document matching an exact term.
  *
  * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html
  *
  * @param string $key
  * @param string $value
  * @param float $boost
  * @return Query
  */
 public function term($key, $value, $boost = 1.0)
 {
     $term = new Term();
     $term->setTerm($key, $value, $boost);
     $query = $this->newQuery($term);
     $this->query[] = $query;
     return $query;
 }
Пример #10
0
 /**
  * @group functional
  */
 public function testCount()
 {
     $index = $this->_createIndex();
     // Add document to normal index
     $doc1 = new Document(null, array('name' => 'ruflin'));
     $doc2 = new Document(null, array('name' => 'nicolas'));
     $type = $index->getType('test');
     $type->addDocument($doc1);
     $type->addDocument($doc2);
     $index->refresh();
     $this->assertEquals(2, $index->count());
     $query = new Term();
     $key = 'name';
     $value = 'nicolas';
     $query->setTerm($key, $value);
     $this->assertEquals(1, $index->count($query));
 }
Пример #11
0
 public function testGetQuery()
 {
     $query = new Query();
     try {
         $query->getQuery();
         $this->fail('should throw exception because query does not exist');
     } catch (InvalidException $e) {
         $this->assertTrue(true);
     }
     $termQuery = new Term();
     $termQuery->setTerm('text', 'value');
     $query->setQuery($termQuery);
     $this->assertEquals($termQuery->toArray(), $query->getQuery());
 }
Пример #12
0
 /**
  * @param string $field
  * @param string $value
  *
  * @return \Elastica\Query\Term
  */
 public function createTermQuery($field, $value)
 {
     $termQuery = new Term();
     return $termQuery->setTerm($field, $value);
 }