/** * Reindex documents from an old index to a new index. * * @link https://www.elastic.co/guide/en/elasticsearch/guide/master/reindex.html * * @param \Elastica\Index $oldIndex * @param \Elastica\Index $newIndex * @param array $options keys: CrossIndex::OPTION_* constants * * @return \Elastica\Index The new index object */ public static function reindex(Index $oldIndex, Index $newIndex, array $options = []) { // prepare search $search = $oldIndex->createSearch(); $options = array_merge([self::OPTION_TYPE => null, self::OPTION_QUERY => new MatchAll(), self::OPTION_EXPIRY_TIME => '1m', self::OPTION_SIZE_PER_SHARD => 1000], $options); if (isset($options[self::OPTION_TYPE])) { $type = $options[self::OPTION_TYPE]; $search->addTypes(is_array($type) ? $type : [$type]); } $search->setQuery($options[self::OPTION_QUERY]); // search on old index and bulk insert in new index $scroll = new Scroll($search, $options[self::OPTION_EXPIRY_TIME]); foreach ($scroll as $resultSet) { $bulk = new Bulk($newIndex->getClient()); $bulk->setIndex($newIndex); foreach ($resultSet as $result) { $action = new Bulk\Action(); $action->setType($result->getType()); $action->setId($result->getId()); $action->setSource($result->getData()); $bulk->addAction($action); } $bulk->send(); } $newIndex->refresh(); return $newIndex; }
/** * @group functional */ public function testCreateSearch() { $client = $this->_getClient(); $index = new Index($client, 'test'); $query = new QueryString('test'); $options = 5; $search = $index->createSearch($query, $options); $expected = array('query' => array('query_string' => array('query' => 'test')), 'size' => 5); $this->assertEquals($expected, $search->getQuery()->toArray()); $this->assertEquals(array('test'), $search->getIndices()); $this->assertTrue($search->hasIndices()); $this->assertTrue($search->hasIndex('test')); $this->assertTrue($search->hasIndex($index)); $this->assertEquals(array(), $search->getTypes()); $this->assertFalse($search->hasTypes()); $this->assertFalse($search->hasType('test_type')); $type = new Type($index, 'test_type2'); $this->assertFalse($search->hasType($type)); }