Skip to content

Commit d089c17

Browse files
authored
Merge pull request #136 from kdambekalns/dfeyer-bulknodeindexerinterface
TASK: Implement BulkNodeIndexerInterface in NodeIndexer This change implements the newly introduced `BulkNodeIndexerInterface` for the TYPO3.TYPO3CR.Search package. When enabled this skips the check for duplicate nodes with a different node type. This check is only useful when changing the node type (live indexing). During the initial indexing this can speed up the process quite a lot for big indexes.
2 parents 1453e8c + 8b2a47d commit d089c17

File tree

2 files changed

+49
-18
lines changed

2 files changed

+49
-18
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ before_install:
1515
- git clone https://github.com/neos/neos-base-distribution.git
1616
- cd neos-base-distribution
1717
- composer require flowpack/elasticsearch-contentrepositoryadaptor dev-master
18+
- composer require typo3/typo3cr-search dev-master
1819
install:
1920
- composer install
2021
- cd ..

Classes/Flowpack/ElasticSearch/ContentRepositoryAdaptor/Indexer/NodeIndexer.php

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use TYPO3\TYPO3CR\Domain\Service\ContextFactory;
2323
use TYPO3\TYPO3CR\Domain\Service\NodeTypeManager;
2424
use TYPO3\TYPO3CR\Search\Indexer\AbstractNodeIndexer;
25+
use TYPO3\TYPO3CR\Search\Indexer\BulkNodeIndexerInterface;
2526

2627
/**
2728
* Indexer for Content Repository Nodes. Triggered from the NodeIndexingManager.
@@ -30,7 +31,7 @@
3031
*
3132
* @Flow\Scope("singleton")
3233
*/
33-
class NodeIndexer extends AbstractNodeIndexer
34+
class NodeIndexer extends AbstractNodeIndexer implements BulkNodeIndexerInterface
3435
{
3536
/**
3637
* Optional postfix for the index, e.g. to have different indexes by timestamp.
@@ -88,6 +89,11 @@ class NodeIndexer extends AbstractNodeIndexer
8889
*/
8990
protected $currentBulkRequest = [];
9091

92+
/**
93+
* @var boolean
94+
*/
95+
protected $bulkProcessing = false;
96+
9197
/**
9298
* Returns the index name to be used for indexing, with optional indexNamePostfix appended.
9399
*
@@ -162,24 +168,26 @@ public function indexNode(NodeInterface $node, $targetWorkspaceName = null)
162168

163169
$mappingType = $this->getIndex()->findType(NodeTypeMappingBuilder::convertNodeTypeNameToMappingName($nodeType));
164170

165-
// Remove document with the same contextPathHash but different NodeType, required after NodeType change
166-
$this->logger->log(sprintf('NodeIndexer: Removing node %s from index (if node type changed from %s). ID: %s', $contextPath, $node->getNodeType()->getName(), $contextPathHash), LOG_DEBUG, null, 'ElasticSearch (CR)');
167-
$this->getIndex()->request('DELETE', '/_query', [], json_encode([
168-
'query' => [
169-
'bool' => [
170-
'must' => [
171-
'ids' => [
172-
'values' => [$contextPathHash]
173-
]
174-
],
175-
'must_not' => [
176-
'term' => [
177-
'_type' => NodeTypeMappingBuilder::convertNodeTypeNameToMappingName($node->getNodeType()->getName())
178-
]
179-
],
171+
if ($this->bulkProcessing === false) {
172+
// Remove document with the same contextPathHash but different NodeType, required after NodeType change
173+
$this->logger->log(sprintf('NodeIndexer: Search and remove duplicate document if needed. ID: %s', $contextPath, $node->getNodeType()->getName(), $contextPathHash), LOG_DEBUG, null, 'ElasticSearch (CR)');
174+
$this->getIndex()->request('DELETE', '/_query', [], json_encode([
175+
'query' => [
176+
'bool' => [
177+
'must' => [
178+
'ids' => [
179+
'values' => [$contextPathHash]
180+
]
181+
],
182+
'must_not' => [
183+
'term' => [
184+
'_type' => NodeTypeMappingBuilder::convertNodeTypeNameToMappingName($node->getNodeType()->getName())
185+
]
186+
],
187+
]
180188
]
181-
]
182-
]));
189+
]));
190+
}
183191

184192
if ($node->isRemoved()) {
185193
// TODO: handle deletion from the fulltext index as well
@@ -541,4 +549,26 @@ public function removeOldIndices()
541549

542550
return $indicesToBeRemoved;
543551
}
552+
553+
/**
554+
* Perform indexing without checking about duplication document
555+
*
556+
* This is used during bulk indexing to improve performance
557+
*
558+
* @param callable $callback
559+
* @throws \Exception
560+
*/
561+
public function withBulkProcessing(callable $callback)
562+
{
563+
$bulkProcessing = $this->bulkProcessing;
564+
$this->bulkProcessing = true;
565+
try {
566+
/** @noinspection PhpUndefinedMethodInspection */
567+
$callback->__invoke();
568+
} catch (\Exception $exception) {
569+
$this->bulkProcessing = $bulkProcessing;
570+
throw $exception;
571+
}
572+
$this->bulkProcessing = $bulkProcessing;
573+
}
544574
}

0 commit comments

Comments
 (0)