summaryrefslogtreecommitdiff
path: root/vendor/ruflin/elastica/lib/Elastica/Tool/CrossIndex.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/ruflin/elastica/lib/Elastica/Tool/CrossIndex.php')
-rw-r--r--vendor/ruflin/elastica/lib/Elastica/Tool/CrossIndex.php160
1 files changed, 160 insertions, 0 deletions
diff --git a/vendor/ruflin/elastica/lib/Elastica/Tool/CrossIndex.php b/vendor/ruflin/elastica/lib/Elastica/Tool/CrossIndex.php
new file mode 100644
index 00000000..89fc0532
--- /dev/null
+++ b/vendor/ruflin/elastica/lib/Elastica/Tool/CrossIndex.php
@@ -0,0 +1,160 @@
+<?php
+namespace Elastica\Tool;
+
+use Elastica\Bulk;
+use Elastica\Index;
+use Elastica\Query\MatchAll;
+use Elastica\ScanAndScroll;
+use Elastica\Search;
+use Elastica\Type;
+
+/**
+ * Functions to move documents and types between indices.
+ *
+ * @author Manuel Andreo Garcia <andreo.garcia@gmail.com>
+ */
+class CrossIndex
+{
+ /**
+ * Type option.
+ *
+ * type: string | string[] | \Elastica\Type | \Elastica\Type[] | null
+ * default: null (means all types)
+ */
+ const OPTION_TYPE = 'type';
+
+ /**
+ * Query option.
+ *
+ * type: see \Elastica\Query::create()
+ * default: Elastica\Query\MatchAll
+ */
+ const OPTION_QUERY = 'query';
+
+ /**
+ * Expiry time option.
+ *
+ * type: string (see Elastica\ScanAndScroll)
+ * default: '1m'
+ */
+ const OPTION_EXPIRY_TIME = 'expiryTime';
+
+ /**
+ * Size per shard option.
+ *
+ * type: int (see Elastica\ScanAndScroll)
+ * default: 1000
+ */
+ const OPTION_SIZE_PER_SHARD = 'sizePerShard';
+
+ /**
+ * 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 = array()
+ ) {
+ // prepare search
+ $search = new Search($oldIndex->getClient());
+
+ $options = array_merge(
+ array(
+ self::OPTION_TYPE => null,
+ self::OPTION_QUERY => new MatchAll(),
+ self::OPTION_EXPIRY_TIME => '1m',
+ self::OPTION_SIZE_PER_SHARD => 1000,
+ ),
+ $options
+ );
+
+ $search->addIndex($oldIndex);
+ if (isset($options[self::OPTION_TYPE])) {
+ $type = $options[self::OPTION_TYPE];
+ $search->addTypes(is_array($type) ? $type : array($type));
+ }
+ $search->setQuery($options[self::OPTION_QUERY]);
+
+ // search on old index and bulk insert in new index
+ $scanAndScroll = new ScanAndScroll(
+ $search,
+ $options[self::OPTION_EXPIRY_TIME],
+ $options[self::OPTION_SIZE_PER_SHARD]
+ );
+ foreach ($scanAndScroll 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;
+ }
+
+ /**
+ * Copies type mappings and documents from an old index to a new index.
+ *
+ * @see \Elastica\Tool\CrossIndex::reindex()
+ *
+ * @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 copy(
+ Index $oldIndex,
+ Index $newIndex,
+ array $options = array()
+ ) {
+ // normalize types to array of string
+ $types = array();
+ if (isset($options[self::OPTION_TYPE])) {
+ $types = $options[self::OPTION_TYPE];
+ $types = is_array($types) ? $types : array($types);
+
+ $types = array_map(
+ function ($type) {
+ if ($type instanceof Type) {
+ $type = $type->getName();
+ }
+
+ return (string) $type;
+ },
+ $types
+ );
+ }
+
+ // copy mapping
+ foreach ($oldIndex->getMapping() as $type => $mapping) {
+ if (!empty($types) && !in_array($type, $types, true)) {
+ continue;
+ }
+
+ $type = new Type($newIndex, $type);
+ $type->setMapping($mapping['properties']);
+ }
+
+ // copy documents
+ return self::reindex($oldIndex, $newIndex, $options);
+ }
+}