package org.molgenis.data.elasticsearch.index;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.ImmutableSettings.Builder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.molgenis.data.elasticsearch.util.ElasticsearchUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.UncheckedIOException;
/**
* Creates ElasticSearch indices.
*/
public class ElasticsearchIndexCreator
{
private static final Logger LOG = LoggerFactory.getLogger(ElasticsearchIndexCreator.class);
public static final String DEFAULT_ANALYZER = "default";
public static final String NGRAM_ANALYZER = "ngram_analyzer";
private static final String NGRAM_TOKENIZER = "ngram_tokenizer";
private static final String DEFAULT_TOKENIZER = "default_tokenizer";
private static final String DEFAULT_STEMMER = "default_stemmer";
private final Client client;
private ElasticsearchUtils elasticsearchUtils;
public ElasticsearchIndexCreator(Client client)
{
this.client = client;
elasticsearchUtils = new ElasticsearchUtils(client);
}
public void createIndexIfNotExists(String indexName)
{
try
{
// Wait until elasticsearch is ready
elasticsearchUtils.waitForYellowStatus();
if (!elasticsearchUtils.indexExists(indexName))
{
createIndexInternal(indexName);
}
}
catch (IOException e)
{
throw new UncheckedIOException(e);
}
}
private void createIndexInternal(String indexName) throws IOException
{
if (LOG.isTraceEnabled()) LOG.trace("Creating Elasticsearch index [" + indexName + "] ...");
Builder settings = ImmutableSettings.settingsBuilder().loadFromSource(
XContentFactory.jsonBuilder().startObject().startObject("analysis").startObject("analyzer")
.startObject(DEFAULT_ANALYZER).field("type", "custom")
.field("filter", new String[] { "lowercase", DEFAULT_STEMMER })
.field("tokenizer", DEFAULT_TOKENIZER).field("char_filter", "html_strip").endObject()
.startObject(NGRAM_ANALYZER).field("type", "custom")
.field("filter", new String[] { "lowercase" }).field("tokenizer", NGRAM_TOKENIZER).endObject()
.endObject().startObject("filter").startObject(DEFAULT_STEMMER).field("type", "stemmer")
.field("name", "english").endObject().endObject().startObject("tokenizer")
.startObject(DEFAULT_TOKENIZER).field("type", "pattern").field("pattern", "([^a-zA-Z0-9]+)")
.endObject().startObject(NGRAM_TOKENIZER).field("type", "nGram").field("min_gram", 1)
.field("max_gram", 10).endObject().endObject().endObject().endObject().string());
CreateIndexResponse response = client.admin().indices().prepareCreate(indexName).setSettings(settings).execute()
.actionGet();
if (!response.isAcknowledged())
{
throw new ElasticsearchException("Creation of index [" + indexName + "] failed. Response=" + response);
}
elasticsearchUtils.waitForYellowStatus();
LOG.debug("Created Elasticsearch index [" + indexName + "]");
}
}