/**
* Copyright (c) 2016 Lemur Consulting Ltd.
* <p/>
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p/>
* http://www.apache.org/licenses/LICENSE-2.0
* <p/>
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package uk.co.flax.biosolr.ontology.search.elasticsearch;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthAction;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequestBuilder;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthStatus;
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsAction;
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequest;
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequestBuilder;
import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.common.unit.TimeValue;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import uk.co.flax.biosolr.ontology.config.ElasticSearchConfiguration;
import uk.co.flax.biosolr.ontology.search.SearchEngine;
import uk.co.flax.biosolr.ontology.search.SearchEngineException;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* Created by mlp on 17/02/16.
*
* @author mlp
*/
public abstract class ElasticSearchEngine implements SearchEngine {
private static final Logger LOGGER = LoggerFactory.getLogger(ElasticSearchEngine.class);
private static final String DYNAMIC_LABEL_FIELD_REGEX = "^.*_rel_labels$";
private final Client client;
private final ElasticSearchConfiguration configuration;
protected ElasticSearchEngine(Client client, ElasticSearchConfiguration config) {
this.client = client;
this.configuration = config;
}
@Override
public boolean isSearchEngineReady() {
ClusterHealthStatus status = new ClusterHealthRequestBuilder(client, ClusterHealthAction.INSTANCE)
.setIndices(configuration.getIndexName())
.setTimeout(new TimeValue(configuration.getTimeoutMillis(), TimeUnit.MILLISECONDS))
.request()
.waitForStatus();
return status != ClusterHealthStatus.RED;
}
@Override
public List<String> getDynamicFieldNames() throws SearchEngineException {
List<String> fieldNames = new LinkedList<>();
try {
GetMappingsRequest req =
new GetMappingsRequestBuilder(client, GetMappingsAction.INSTANCE, configuration.getIndexName())
.setTypes(configuration.getDocType())
.request();
GetMappingsResponse response = client.admin().indices().getMappings(req).actionGet();
MappingMetaData metaData = response.getMappings()
.get(configuration.getIndexName())
.get(configuration.getDocType());
Map<String, Object> sourceMap = metaData.getSourceAsMap();
Object annotationField = ((Map)sourceMap.get("properties")).get(configuration.getAnnotationField());
Map<String, Object> annotationProperties = (Map<String, Object>)((Map)annotationField).get("properties");
if (annotationProperties != null) {
for (String field : annotationProperties.keySet()) {
if (field.matches(DYNAMIC_LABEL_FIELD_REGEX)) {
fieldNames.add(field);
}
}
}
} catch (IOException e) {
LOGGER.error("Caught IOException retrieving field source: {}", e.getMessage());
throw new SearchEngineException(e);
}
return fieldNames;
}
protected Client getClient() {
return client;
}
protected String getIndexName() {
return configuration.getIndexName();
}
protected String getDocumentType() {
return configuration.getDocType();
}
protected String getAnnotationField() {
return configuration.getAnnotationField();
}
}