/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.elasticsearch.schema.impl;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.hibernate.search.analyzer.spi.AnalyzerReference;
import org.hibernate.search.elasticsearch.analyzer.impl.ElasticsearchAnalyzer;
import org.hibernate.search.elasticsearch.analyzer.impl.ElasticsearchAnalyzerReference;
import org.hibernate.search.elasticsearch.logging.impl.Log;
import org.hibernate.search.elasticsearch.schema.impl.model.DataType;
import org.hibernate.search.elasticsearch.schema.impl.model.FieldDataType;
import org.hibernate.search.elasticsearch.schema.impl.model.IndexType;
import org.hibernate.search.elasticsearch.schema.impl.model.NormsType;
import org.hibernate.search.elasticsearch.schema.impl.model.PropertyMapping;
import org.hibernate.search.elasticsearch.settings.impl.ElasticsearchIndexSettingsBuilder;
import org.hibernate.search.elasticsearch.util.impl.FieldHelper;
import org.hibernate.search.engine.metadata.impl.FacetMetadata;
import org.hibernate.search.engine.metadata.impl.PropertyMetadata;
import org.hibernate.search.util.logging.impl.LoggerFactory;
/**
* An {@link ElasticsearchSchemaTranslator} implementation for Elasticsearch 5.
*
* @author Yoann Rodiere
*/
public class Elasticsearch5SchemaTranslator extends Elasticsearch2SchemaTranslator {
private static final Log log = LoggerFactory.make( Log.class );
@Override
protected PropertyMapping generateTenantIdProperty() {
PropertyMapping tenantId = new PropertyMapping();
tenantId.setType( DataType.KEYWORD );
tenantId.setIndex( IndexType.TRUE );
return tenantId;
}
@Override
protected void addSubfieldIndexOptions(PropertyMapping fieldMapping, FacetMetadata facetMetadata) {
fieldMapping.setIndex( IndexType.TRUE );
}
@Override
@SuppressWarnings("deprecation")
protected void addIndexOptions(PropertyMapping propertyMapping, ElasticsearchMappingBuilder mappingBuilder,
ElasticsearchIndexSettingsBuilder settingsBuilder, PropertyMetadata sourceProperty,
String propertyPath, Field.Index index, AnalyzerReference analyzerReference) {
propertyMapping.setIndex( index.isIndexed() ? IndexType.TRUE : IndexType.FALSE );
DataType type = propertyMapping.getType();
if ( FieldHelper.isSortableField( mappingBuilder.getMetadata(), sourceProperty, propertyPath ) ) {
if ( DataType.TEXT.equals( type ) ) {
// Text fields do not support sort by default, and do not support doc values
propertyMapping.setFieldData( FieldDataType.TRUE );
}
else if ( !index.isIndexed() ) {
// We must use doc values in order to enable sorting on non-indexed fields
propertyMapping.setDocValues( true );
}
}
// Only text fields can be analyzed
if ( DataType.TEXT.equals( type ) && analyzerReference != null ) {
if ( !analyzerReference.is( ElasticsearchAnalyzerReference.class ) ) {
log.analyzerIsNotElasticsearch( mappingBuilder.getBeanClass(), propertyPath, analyzerReference );
}
else {
ElasticsearchAnalyzerReference elasticsearchReference = analyzerReference.unwrap( ElasticsearchAnalyzerReference.class );
ElasticsearchAnalyzer analyzer = elasticsearchReference.getAnalyzer();
String analyzerName = settingsBuilder.register( analyzer, propertyPath );
propertyMapping.setAnalyzer( analyzerName );
}
}
// Only text and keyword fields can have norms
if ( DataType.TEXT.equals( type ) || DataType.KEYWORD.equals( type ) ) {
propertyMapping.setNorms( index.omitNorms() ? NormsType.FALSE : NormsType.TRUE );
}
}
@Override
@SuppressWarnings("deprecation")
protected DataType getStringType(PropertyMapping propertyMapping, Index index) {
return index.isAnalyzed() ? DataType.TEXT : DataType.KEYWORD;
}
}