From f4db1081fd28c379768b59a1346b016b03647267 Mon Sep 17 00:00:00 2001 From: Mathieu Darse Date: Thu, 27 Aug 2015 17:01:20 +0200 Subject: [PATCH] Optimize highlight speed --- .../Elastic/ElasticSearchEngine.php | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php index 2c8010ef85..b586cca087 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php @@ -272,15 +272,7 @@ class ElasticSearchEngine implements SearchEngineInterface $params['body']['from'] = $offset; $params['body']['size'] = $perPage; - $params['body']['highlight'] = [ - 'pre_tags' => ['[[em]]'], - 'post_tags' => ['[[/em]]'], - 'order' => 'score', - 'fields' => [ - 'caption.*' => new \stdClass(), - 'private_caption.*' => new \stdClass() - ] - ]; + $params['body']['highlight'] = $this->buildHighlightRules($context); if ($aggs = $this->getAggregationQueryParams($options)) { $params['body']['aggs'] = $aggs; @@ -319,6 +311,39 @@ class ElasticSearchEngine implements SearchEngineInterface ); } + private function buildHighlightRules(QueryContext $context) + { + $fields = $context->getUnrestrictedFields() + $context->getPrivateFields(); + $highlighted_fields = []; + foreach ($fields as $field) { + switch ($field->getType()) { + case Mapping::TYPE_STRING: + $highlighted_fields[$field->getIndexField()] = [ + // Requires calling Mapping::highlight() on this field mapping + 'type' => 'fvh' + ]; + break; + case Mapping::TYPE_FLOAT: + case Mapping::TYPE_DOUBLE: + case Mapping::TYPE_INTEGER: + case Mapping::TYPE_LONG: + case Mapping::TYPE_SHORT: + case Mapping::TYPE_BYTE: + continue; + case Mapping::TYPE_DATE: + default: + continue; + } + } + + return [ + 'pre_tags' => ['[[em]]'], + 'post_tags' => ['[[/em]]'], + 'order' => 'score', + 'fields' => $highlighted_fields + ]; + } + /** * @todo Move in search engine service provider */