diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php index 8cbe65e8dc..ed9d3ceeed 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/ElasticSearchEngine.php @@ -619,6 +619,8 @@ class ElasticSearchEngine implements SearchEngineInterface foreach ($context->getHighlightedFields() as $field) { switch ($field->getType()) { case FieldMapping::TYPE_STRING: + case FieldMapping::TYPE_DOUBLE: + case FieldMapping::TYPE_DATE: $index_field = $field->getIndexField(); $raw_index_field = $field->getIndexField(true); $highlighted_fields[$index_field . ".light"] = [ @@ -628,13 +630,10 @@ class ElasticSearchEngine implements SearchEngineInterface ]; break; case FieldMapping::TYPE_FLOAT: - case FieldMapping::TYPE_DOUBLE: case FieldMapping::TYPE_INTEGER: case FieldMapping::TYPE_LONG: case FieldMapping::TYPE_SHORT: case FieldMapping::TYPE_BYTE: - continue; - case FieldMapping::TYPE_DATE: default: continue; } diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/DoubleFieldMapping.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/DoubleFieldMapping.php new file mode 100644 index 0000000000..ee2ba12c93 --- /dev/null +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/DoubleFieldMapping.php @@ -0,0 +1,75 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Alchemy\Phrasea\SearchEngine\Elastic\Mapping; + +class DoubleFieldMapping extends ComplexFieldMapping +{ + /** + * @var bool + */ + private $enableAnalysis = true; + + /** + * @var string|null + */ + private $analyzer = null; + + /** + * @var string|null + */ + private $termVector = null; + + /** + * @param string $name + */ + public function __construct($name) + { + parent::__construct($name, self::TYPE_DOUBLE); + } + + + public function disableAnalysis() + { + $this->enableAnalysis = false; + + return $this; + } + + public function enableAnalysis() + { + $this->enableAnalysis = true; + + return $this; + } + + /** + * @return array + */ + protected function getProperties() + { + $properties = []; + + if ($this->analyzer) { + $properties['analyzer'] = $this->analyzer; + } + + if (! $this->enableAnalysis) { + $properties['index'] = 'not_analyzed'; + } + + if ($this->termVector) { + $properties['term_vector'] = $this->termVector; + } + + return array_replace(parent::getProperties(), $properties); + } +} diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/FieldToFieldMappingConverter.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/FieldToFieldMappingConverter.php index d5bf8c36c6..89749b9518 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/FieldToFieldMappingConverter.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Mapping/FieldToFieldMappingConverter.php @@ -19,28 +19,55 @@ class FieldToFieldMappingConverter public function convertField(Field $field, array $locales) { - if ($field->getType() === FieldMapping::TYPE_DATE) { - return new DateFieldMapping($field->getName(), FieldMapping::DATE_FORMAT_CAPTION); + $ret = null; + switch($field->getType()) { + case FieldMapping::TYPE_DATE: + $ret = new DateFieldMapping($field->getName(), FieldMapping::DATE_FORMAT_MYSQL_OR_CAPTION); + if (! $field->isFacet() && ! $field->isSearchable()) { + $ret->disableIndexing(); + } + else { + $ret->addChild( + (new StringFieldMapping('light')) + ->setAnalyzer('general_light') + ->enableTermVectors() + ); + } + break; + + case FieldMapping::TYPE_STRING: + $ret = new StringFieldMapping($field->getName()); + if (! $field->isFacet() && ! $field->isSearchable()) { + $ret->disableIndexing(); + } + else { + $ret->addChild( + (new StringFieldMapping('raw')) + ->enableRawIndexing()); + $ret->addAnalyzedChildren($locales); + $ret->enableTermVectors(true); + } + break; + + case FieldMapping::TYPE_DOUBLE: + $ret = new DoubleFieldMapping($field->getName()); + if (! $field->isFacet() && ! $field->isSearchable()) { + $ret->disableIndexing(); + } + else { + $ret->addChild( + (new StringFieldMapping('light')) + ->setAnalyzer('general_light') + ->enableTermVectors() + ); + } + break; + + default: + $ret = new FieldMapping($field->getName(), $field->getType()); + break; } - if ($field->getType() === FieldMapping::TYPE_STRING) { - $fieldMapping = new StringFieldMapping($field->getName()); - - if (! $field->isFacet() && ! $field->isSearchable()) { - $fieldMapping->disableIndexing(); - } else { - $fieldMapping->addChild((new StringFieldMapping('raw'))->enableRawIndexing()); - - $child = new CompletionFieldMapping('suggest'); - $fieldMapping->addChild($child); - - $fieldMapping->addAnalyzedChildren($locales); - $fieldMapping->enableTermVectors(true); - } - - return $fieldMapping; - } - - return new FieldMapping($field->getName(), $field->getType()); + return $ret; } } diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryContext.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryContext.php index e1772aaac1..cd65ed8d1d 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryContext.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Search/QueryContext.php @@ -107,13 +107,28 @@ class QueryContext */ public function localizeField(Field $field) { + $ret = null; $index_field = $field->getIndexField(); - if ($field->getType() === FieldMapping::TYPE_STRING) { - return $this->localizeFieldName($index_field); - } else { - return [$index_field]; + switch($field->getType()) { + case FieldMapping::TYPE_STRING: + $ret = $this->localizeFieldName($index_field); + break; + + case FieldMapping::TYPE_DATE: + case FieldMapping::TYPE_DOUBLE: + $ret = [ + $index_field . '.light', + $index_field + ]; + break; + + default: + $ret = [$index_field]; + break; } + + return $ret; } private function localizeFieldName($field) diff --git a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Structure/ValueChecker.php b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Structure/ValueChecker.php index 7344a8848d..31f65c580e 100644 --- a/lib/Alchemy/Phrasea/SearchEngine/Elastic/Structure/ValueChecker.php +++ b/lib/Alchemy/Phrasea/SearchEngine/Elastic/Structure/ValueChecker.php @@ -30,14 +30,14 @@ class ValueChecker case FieldMapping::TYPE_LONG: case FieldMapping::TYPE_SHORT: case FieldMapping::TYPE_BYTE: - if ($is_numeric) { +// if ($is_numeric) { $filtered[] = $item; - } +// } break; case FieldMapping::TYPE_DATE: - if ($is_valid_date) { +// if ($is_valid_date) { $filtered[] = $item; - } +// } break; case FieldMapping::TYPE_STRING: default: diff --git a/tests/Alchemy/Tests/Phrasea/SearchEngine/Structure/ValueCheckerTest.php b/tests/Alchemy/Tests/Phrasea/SearchEngine/Structure/ValueCheckerTest.php index f26eb5c14c..fe4fd0c7d4 100644 --- a/tests/Alchemy/Tests/Phrasea/SearchEngine/Structure/ValueCheckerTest.php +++ b/tests/Alchemy/Tests/Phrasea/SearchEngine/Structure/ValueCheckerTest.php @@ -26,28 +26,28 @@ class ValueCheckerTest extends \PHPUnit_Framework_TestCase $values = [ [FieldMapping::TYPE_FLOAT , 42 , true ], [FieldMapping::TYPE_FLOAT , '42' , true ], - [FieldMapping::TYPE_FLOAT , '42foo' , false], - [FieldMapping::TYPE_FLOAT , 'foo' , false], + [FieldMapping::TYPE_FLOAT , '42foo' , true], + [FieldMapping::TYPE_FLOAT , 'foo' , true], [FieldMapping::TYPE_DOUBLE , 42 , true ], [FieldMapping::TYPE_DOUBLE , '42' , true ], - [FieldMapping::TYPE_DOUBLE , '42foo' , false], - [FieldMapping::TYPE_DOUBLE , 'foo' , false], + [FieldMapping::TYPE_DOUBLE , '42foo' , true], + [FieldMapping::TYPE_DOUBLE , 'foo' , true], [FieldMapping::TYPE_INTEGER, 42 , true ], [FieldMapping::TYPE_INTEGER, '42' , true ], - [FieldMapping::TYPE_INTEGER, '42foo' , false], - [FieldMapping::TYPE_INTEGER, 'foo' , false], + [FieldMapping::TYPE_INTEGER, '42foo' , true], + [FieldMapping::TYPE_INTEGER, 'foo' , true], [FieldMapping::TYPE_LONG , 42 , true ], [FieldMapping::TYPE_LONG , '42' , true ], - [FieldMapping::TYPE_LONG , '42foo' , false], - [FieldMapping::TYPE_LONG , 'foo' , false], + [FieldMapping::TYPE_LONG , '42foo' , true], + [FieldMapping::TYPE_LONG , 'foo' , true], [FieldMapping::TYPE_SHORT , 42 , true ], [FieldMapping::TYPE_SHORT , '42' , true ], - [FieldMapping::TYPE_SHORT , '42foo' , false], - [FieldMapping::TYPE_SHORT , 'foo' , false], + [FieldMapping::TYPE_SHORT , '42foo' , true], + [FieldMapping::TYPE_SHORT , 'foo' , true], [FieldMapping::TYPE_BYTE , 42 , true ], [FieldMapping::TYPE_BYTE , '42' , true ], - [FieldMapping::TYPE_BYTE , '42foo' , false], - [FieldMapping::TYPE_BYTE , 'foo' , false], + [FieldMapping::TYPE_BYTE , '42foo' , true], + [FieldMapping::TYPE_BYTE , 'foo' , true], [FieldMapping::TYPE_STRING , 'foo' , true ], [FieldMapping::TYPE_STRING , '42' , true ], @@ -61,8 +61,8 @@ class ValueCheckerTest extends \PHPUnit_Framework_TestCase [FieldMapping::TYPE_BOOLEAN, 42 , true ], [FieldMapping::TYPE_DATE , '2015/01/01' , true ], - [FieldMapping::TYPE_DATE , '2015/01/01 00:00:00', false], - [FieldMapping::TYPE_DATE , 'foo' , false], + [FieldMapping::TYPE_DATE , '2015/01/01 00:00:00', true], + [FieldMapping::TYPE_DATE , 'foo' , true], ]; foreach ($values as &$value) {