All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.molgenis.data.elasticsearch.index.ElasticsearchIndexCreator Maven / Gradle / Ivy

The newest version!
package org.molgenis.data.elasticsearch.index;

import java.io.IOException;
import java.io.UncheckedIOException;

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;

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 + "]");
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy