%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/CirrusSearch/maintenance/ |
| Current File : //www/varak.net/wiki.varak.net/extensions/CirrusSearch/maintenance/copySearchIndex.php |
<?php
namespace CirrusSearch\Maintenance;
use CirrusSearch\Connection;
use CirrusSearch\ClusterSettings;
use CirrusSearch\SearchConfig;
use MediaWiki\MediaWikiServices;
/**
* Copy search index from one cluster to another.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* http://www.gnu.org/copyleft/gpl.html
*/
$IP = getenv( 'MW_INSTALL_PATH' );
if( $IP === false ) {
$IP = __DIR__ . '/../../..';
}
require_once( "$IP/maintenance/Maintenance.php" );
require_once( __DIR__ . '/../includes/Maintenance/Maintenance.php' );
/**
* Update the elasticsearch configuration for this index.
*/
class CopySearchIndex extends Maintenance {
/**
* @var string
*/
private $indexType;
/**
* @var string
*/
private $indexBaseName;
/**
* @var int
*/
protected $refreshInterval;
public function __construct() {
parent::__construct();
$this->addDescription( "Copy index from one cluster to another.\nThe index name and index type should be the same on both clusters." );
$this->addOption( 'indexType', 'Source index. Either content or general.', true, true );
$this->addOption( 'targetCluster', 'Target Cluster.', true, true );
$this->addOption( 'reindexChunkSize', 'Documents per shard to reindex in a batch. ' .
'Note when changing the number of shards that the old shard size is used, not the new ' .
'one. If you see many errors submitting documents in bulk but the automatic retry as ' .
'singles works then lower this number. Defaults to 100.', false, true );
$this->addOption( 'reindexRetryAttempts', 'Number of times to back off and retry ' .
'per failure. Note that failures are not common but if Elasticsearch is in the process ' .
'of moving a shard this can time out. This will retry the attempt after some backoff ' .
'rather than failing the whole reindex process. Defaults to 5.', false, true );
$this->addOption( 'processes', 'Number of processes to copy with. Defaults to 1', false, true );
}
public function execute() {
$this->indexType = $this->getOption( 'indexType' );
$this->indexBaseName = $this->getOption( 'baseName', $this->getSearchConfig()->get( SearchConfig::INDEX_BASE_NAME ) );
$reindexChunkSize = $this->getOption( 'reindexChunkSize', 100 );
$reindexRetryAttempts = $this->getOption( 'reindexRetryAttempts', 5 );
$targetCluster = $this->getOption( 'targetCluster' );
$processes = $this->getOption( 'processes', 1 );
$sourceConnection = $this->getConnection();
$targetConnection = $this->getConnection( $targetCluster );
if ( $sourceConnection->getClusterName() == $targetConnection->getClusterName() ) {
$this->error("Target cluster should be different from current cluster.", 1);
}
$clusterSettings = new ClusterSettings( $this->getSearchConfig(), $targetConnection->getClusterName() );
$targetIndexName = $targetConnection->getIndexName( $this->indexBaseName, $this->indexType );
$utils = new ConfigUtils( $targetConnection->getClient(), $this );
$indexIdentifier = $utils->pickIndexIdentifierFromOption( $this->getOption( 'indexIdentifier', 'current' ),
$targetIndexName );
$reindexer = new Reindexer(
$this->getSearchConfig(),
$sourceConnection,
$targetConnection,
// Target Index
[ $targetConnection->getIndex( $this->indexBaseName, $this->indexType,
$indexIdentifier )->getType( Connection::PAGE_TYPE_NAME )
],
// Source Index
[ $this->getConnection()->getPageType( $this->indexBaseName, $this->indexType ) ],
$clusterSettings->getShardCount( $this->indexType ),
$clusterSettings->getReplicaCount( $this->indexType ),
$this->getMergeSettings(),
$this->getMappingConfig(),
$this
);
$reindexer->reindex( $processes, 1, $reindexRetryAttempts, $reindexChunkSize);
$reindexer->optimize();
$reindexer->waitForShards();
}
/**
* Get the merge settings for this index.
* @return array
*/
private function getMergeSettings() {
global $wgCirrusSearchMergeSettings;
if ( isset( $wgCirrusSearchMergeSettings[ $this->indexType ] ) ) {
return $wgCirrusSearchMergeSettings[ $this->indexType ];
}
// If there aren't configured merge settings for this index type default to the content type.
return $wgCirrusSearchMergeSettings[ 'content' ];
}
/**
* @return array
*/
protected function getMappingConfig() {
global $wgCirrusSearchPrefixSearchStartsWithAnyWord, $wgCirrusSearchPhraseSuggestUseText,
$wgCirrusSearchOptimizeIndexForExperimentalHighlighter;
$builder = new MappingConfigBuilder( $wgCirrusSearchOptimizeIndexForExperimentalHighlighter );
$configFlags = 0;
if ( $wgCirrusSearchPrefixSearchStartsWithAnyWord ) {
$configFlags |= MappingConfigBuilder::PREFIX_START_WITH_ANY;
}
if ( $wgCirrusSearchPhraseSuggestUseText ) {
$configFlags |= MappingConfigBuilder::PHRASE_SUGGEST_USE_TEXT;
}
return $builder->buildConfig( $configFlags );
}
}
$maintClass = CopySearchIndex::class;
require_once RUN_MAINTENANCE_IF_MAIN;