port to 4.1 search mix type

This commit is contained in:
aina-esokia
2019-03-22 12:04:42 +04:00
parent e426eff8af
commit eaf8cf076a
6 changed files with 162 additions and 46 deletions

View File

@@ -619,6 +619,8 @@ class ElasticSearchEngine implements SearchEngineInterface
foreach ($context->getHighlightedFields() as $field) { foreach ($context->getHighlightedFields() as $field) {
switch ($field->getType()) { switch ($field->getType()) {
case FieldMapping::TYPE_STRING: case FieldMapping::TYPE_STRING:
case FieldMapping::TYPE_DOUBLE:
case FieldMapping::TYPE_DATE:
$index_field = $field->getIndexField(); $index_field = $field->getIndexField();
$raw_index_field = $field->getIndexField(true); $raw_index_field = $field->getIndexField(true);
$highlighted_fields[$index_field . ".light"] = [ $highlighted_fields[$index_field . ".light"] = [
@@ -628,13 +630,10 @@ class ElasticSearchEngine implements SearchEngineInterface
]; ];
break; break;
case FieldMapping::TYPE_FLOAT: case FieldMapping::TYPE_FLOAT:
case FieldMapping::TYPE_DOUBLE:
case FieldMapping::TYPE_INTEGER: case FieldMapping::TYPE_INTEGER:
case FieldMapping::TYPE_LONG: case FieldMapping::TYPE_LONG:
case FieldMapping::TYPE_SHORT: case FieldMapping::TYPE_SHORT:
case FieldMapping::TYPE_BYTE: case FieldMapping::TYPE_BYTE:
continue;
case FieldMapping::TYPE_DATE:
default: default:
continue; continue;
} }

View File

@@ -0,0 +1,75 @@
<?php
/*
* This file is part of phrasea-4.0.
*
* (c) Alchemy <info@alchemy.fr>
*
* 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);
}
}

View File

@@ -19,28 +19,55 @@ class FieldToFieldMappingConverter
public function convertField(Field $field, array $locales) public function convertField(Field $field, array $locales)
{ {
if ($field->getType() === FieldMapping::TYPE_DATE) { $ret = null;
return new DateFieldMapping($field->getName(), FieldMapping::DATE_FORMAT_CAPTION); 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) { return $ret;
$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());
} }
} }

View File

@@ -107,13 +107,28 @@ class QueryContext
*/ */
public function localizeField(Field $field) public function localizeField(Field $field)
{ {
$ret = null;
$index_field = $field->getIndexField(); $index_field = $field->getIndexField();
if ($field->getType() === FieldMapping::TYPE_STRING) { switch($field->getType()) {
return $this->localizeFieldName($index_field); case FieldMapping::TYPE_STRING:
} else { $ret = $this->localizeFieldName($index_field);
return [$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) private function localizeFieldName($field)

View File

@@ -30,14 +30,14 @@ class ValueChecker
case FieldMapping::TYPE_LONG: case FieldMapping::TYPE_LONG:
case FieldMapping::TYPE_SHORT: case FieldMapping::TYPE_SHORT:
case FieldMapping::TYPE_BYTE: case FieldMapping::TYPE_BYTE:
if ($is_numeric) { // if ($is_numeric) {
$filtered[] = $item; $filtered[] = $item;
} // }
break; break;
case FieldMapping::TYPE_DATE: case FieldMapping::TYPE_DATE:
if ($is_valid_date) { // if ($is_valid_date) {
$filtered[] = $item; $filtered[] = $item;
} // }
break; break;
case FieldMapping::TYPE_STRING: case FieldMapping::TYPE_STRING:
default: default:

View File

@@ -26,28 +26,28 @@ class ValueCheckerTest extends \PHPUnit_Framework_TestCase
$values = [ $values = [
[FieldMapping::TYPE_FLOAT , 42 , true ], [FieldMapping::TYPE_FLOAT , 42 , true ],
[FieldMapping::TYPE_FLOAT , '42' , true ], [FieldMapping::TYPE_FLOAT , '42' , true ],
[FieldMapping::TYPE_FLOAT , '42foo' , false], [FieldMapping::TYPE_FLOAT , '42foo' , true],
[FieldMapping::TYPE_FLOAT , 'foo' , false], [FieldMapping::TYPE_FLOAT , 'foo' , true],
[FieldMapping::TYPE_DOUBLE , 42 , true ], [FieldMapping::TYPE_DOUBLE , 42 , true ],
[FieldMapping::TYPE_DOUBLE , '42' , true ], [FieldMapping::TYPE_DOUBLE , '42' , true ],
[FieldMapping::TYPE_DOUBLE , '42foo' , false], [FieldMapping::TYPE_DOUBLE , '42foo' , true],
[FieldMapping::TYPE_DOUBLE , 'foo' , false], [FieldMapping::TYPE_DOUBLE , 'foo' , true],
[FieldMapping::TYPE_INTEGER, 42 , true ], [FieldMapping::TYPE_INTEGER, 42 , true ],
[FieldMapping::TYPE_INTEGER, '42' , true ], [FieldMapping::TYPE_INTEGER, '42' , true ],
[FieldMapping::TYPE_INTEGER, '42foo' , false], [FieldMapping::TYPE_INTEGER, '42foo' , true],
[FieldMapping::TYPE_INTEGER, 'foo' , false], [FieldMapping::TYPE_INTEGER, 'foo' , true],
[FieldMapping::TYPE_LONG , 42 , true ], [FieldMapping::TYPE_LONG , 42 , true ],
[FieldMapping::TYPE_LONG , '42' , true ], [FieldMapping::TYPE_LONG , '42' , true ],
[FieldMapping::TYPE_LONG , '42foo' , false], [FieldMapping::TYPE_LONG , '42foo' , true],
[FieldMapping::TYPE_LONG , 'foo' , false], [FieldMapping::TYPE_LONG , 'foo' , true],
[FieldMapping::TYPE_SHORT , 42 , true ], [FieldMapping::TYPE_SHORT , 42 , true ],
[FieldMapping::TYPE_SHORT , '42' , true ], [FieldMapping::TYPE_SHORT , '42' , true ],
[FieldMapping::TYPE_SHORT , '42foo' , false], [FieldMapping::TYPE_SHORT , '42foo' , true],
[FieldMapping::TYPE_SHORT , 'foo' , false], [FieldMapping::TYPE_SHORT , 'foo' , true],
[FieldMapping::TYPE_BYTE , 42 , true ], [FieldMapping::TYPE_BYTE , 42 , true ],
[FieldMapping::TYPE_BYTE , '42' , true ], [FieldMapping::TYPE_BYTE , '42' , true ],
[FieldMapping::TYPE_BYTE , '42foo' , false], [FieldMapping::TYPE_BYTE , '42foo' , true],
[FieldMapping::TYPE_BYTE , 'foo' , false], [FieldMapping::TYPE_BYTE , 'foo' , true],
[FieldMapping::TYPE_STRING , 'foo' , true ], [FieldMapping::TYPE_STRING , 'foo' , true ],
[FieldMapping::TYPE_STRING , '42' , true ], [FieldMapping::TYPE_STRING , '42' , true ],
@@ -61,8 +61,8 @@ class ValueCheckerTest extends \PHPUnit_Framework_TestCase
[FieldMapping::TYPE_BOOLEAN, 42 , true ], [FieldMapping::TYPE_BOOLEAN, 42 , true ],
[FieldMapping::TYPE_DATE , '2015/01/01' , true ], [FieldMapping::TYPE_DATE , '2015/01/01' , true ],
[FieldMapping::TYPE_DATE , '2015/01/01 00:00:00', false], [FieldMapping::TYPE_DATE , '2015/01/01 00:00:00', true],
[FieldMapping::TYPE_DATE , 'foo' , false], [FieldMapping::TYPE_DATE , 'foo' , true],
]; ];
foreach ($values as &$value) { foreach ($values as &$value) {