/* * Copyright 2010 Peter Karich jetwick_@_pannous_._info * * 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 * * http://www.apache.org/licenses/LICENSE-2.0 * * 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 de.jetwick.es; import org.elasticsearch.node.NodeBuilder; import org.elasticsearch.common.settings.ImmutableSettings.Builder; import java.io.File; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest; import org.elasticsearch.action.admin.cluster.node.info.NodesInfoRequest; import org.elasticsearch.action.admin.cluster.node.info.NodesInfoResponse; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.client.Client; import org.elasticsearch.node.Node; import static org.elasticsearch.node.NodeBuilder.*; /** * * @author Peter Karich, peat_hal 'at' users 'dot' sourceforge 'dot' net */ public class ElasticNode { private static Logger logger = LoggerFactory.getLogger(ElasticNode.class); public static final String CLUSTER = "jetwickcluster"; public static final int PORT = 9300; public static void main(String[] args) throws IOException, InterruptedException { ElasticNode node = new ElasticNode().start("es"); node.waitForYellow(); node.printInfo(); // normally we create indices via scripts but a dev can get faster started ElasticTweetSearch twSearch = new ElasticTweetSearch(node.client()); twSearch.saveCreateIndex(); ElasticUserSearch uSearch = new ElasticUserSearch(node.client()); uSearch.saveCreateIndex(); ElasticTagSearch tagSearch = new ElasticTagSearch(node.client()); tagSearch.saveCreateIndex(); Thread.currentThread().join(); } private Node node; private boolean started = false; public ElasticNode start(String dataHome) { return start(dataHome, dataHome + "/config", false); } public ElasticNode start(String home, String conf, boolean testing) { // see // http://www.elasticsearch.com/docs/elasticsearch/setup/installation/ // http://www.elasticsearch.com/docs/elasticsearch/setup/dirlayout/ File homeDir = new File(home); System.setProperty("es.path.home", homeDir.getAbsolutePath()); System.setProperty("es.path.conf", conf); // increase maxClauseCount for friend search ... not necessary // http://wiki.apache.org/lucene-java/LuceneFAQ#Why_am_I_getting_a_TooManyClauses_exception.3F // BooleanQuery.setMaxClauseCount(100000); Builder settings = ImmutableSettings.settingsBuilder(); // put("network.host", "127.0.0.1"). // // put("network.bindHost", "127.0.0.0"). // // put("network.publishHost", "127.0.0.0"). // put("index.number_of_shards", 16). // put("index.number_of_replicas", 1); if (testing) { settings.put("gateway.type", "none"); // default is local // none means no data after node restart! // does not work when transportclient connects: // put("gateway.type", "fs"). // put("gateway.fs.location", homeDir.getAbsolutePath()). } settings.build(); NodeBuilder nBuilder = nodeBuilder().settings(settings); if (!testing) { nBuilder.clusterName(CLUSTER); } else { nBuilder.local(true); } node = nBuilder.build().start(); started = true; logger.info("Started Node in cluster " + CLUSTER + ". Home folder: " + homeDir.getAbsolutePath()); return this; } public void stop() { if (node == null) throw new RuntimeException("Node not started"); started = false; node.close(); } public boolean isStarted() { return started; } public Client client() { if (node == null) throw new RuntimeException("Node not started"); return node.client(); } /** * Warning: Can take several 10 seconds! */ public void waitForYellow() { node.client().admin().cluster().health(new ClusterHealthRequest("twindex").waitForYellowStatus()).actionGet(); logger.info("Now node status is 'yellow'!"); } public void waitForOneActiveShard() { node.client().admin().cluster().health(new ClusterHealthRequest("twindex").waitForActiveShards(1)).actionGet(); logger.info("Now node has at least one active shard!"); } public void printInfo() { NodesInfoResponse rsp = node.client().admin().cluster().nodesInfo(new NodesInfoRequest()).actionGet(); String str = "Cluster:" + rsp.getClusterName() + ". Active nodes:"; str += rsp.getNodesMap().keySet(); logger.info(str); } }