本文共 10735 字,大约阅读时间需要 35 分钟。
1. 启动elasticsearch su - elasticsearch cd /appl/elasticsearch-2.1.1/ bin/elasticsearch -d -p pid(初始调试时使用:bin/elasticsearch, 关闭:kill `cat pid`) 2. curl命令 查看cluster、version:curl 'centos1:9200' 插入:curl -XPUT 'http://localhost:9200/dept/employee/1' -d '{ "empname": "emp1"}' 查看index:curl 'centos1:9200/_cat/indices?v' 查看1条内容:curl 'centos1:9200/dept/employee/1?pretty' 查看所有内容:curl 'centos1:9200/dept/employee/_search' 简易搜索:curl 'centos1:9200/dept/employee/_search?empname=emp1' 复杂搜索:curl 'centos1:9200/dept/employee/_search?pretty' -d '{"query" : {"match" : {"empname" : "emp2"}}}' 删除:curl -XDELETE 'http://172.16.1.16:9200/logstash-2016.02.*' 3.1 ES原生API连接搜索(Java,非RestFul连接而是广播) 说明:Es的集群非常简单,只要在同一个局域网内,多台服务器能互相通讯,并且cluster.name是一样的,就能自动集在一起。import java.net.InetAddress;import java.net.UnknownHostException;import java.util.ArrayList;import java.util.Collection;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.client.Client;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.InetSocketTransportAddress;import org.elasticsearch.index.query.FuzzyQueryBuilder;import org.elasticsearch.index.query.MatchQueryBuilder;import org.elasticsearch.index.query.QueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.index.query.QueryStringQueryBuilder;import org.elasticsearch.index.query.RangeQueryBuilder;import org.elasticsearch.index.query.TermQueryBuilder;import org.elasticsearch.index.query.TermsQueryBuilder;import org.elasticsearch.index.query.WildcardQueryBuilder;import org.elasticsearch.node.Node;import org.elasticsearch.node.NodeBuilder;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.builder.SearchSourceBuilder;/* Implement ElasticSearch internal Java API (broadcast) * Refer * http://www.tuicool.com/articles/R7RVJb * https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search.html * http://stackoverflow.com/questions/23520684/elasticsearch-java-apinonodeavailableexception-no-node-available * Node Transport Difference - http://www.cnblogs.com/huangfox/p/3543134.html * */public class EsQuery01 { public static void main(String[] args) throws Exception { // 1. Prepare Transport //Client client = buildClientByNode(); Client client = buildClientByTransport(); // 2. Prepare Query Param QueryBuilder queryBuilder = buildQuery(); // 3. Get Response SearchResponse response = client.prepareSearch("dept") .setTypes("employee") .setQuery(queryBuilder) .setFrom(0).setSize(2) .execute() .actionGet(); //SearchResponse response = client.prepareSearch().execute().actionGet(); if (response != null) { System.out.println(response); for (SearchHit hit : response.getHits().getHits()) { System.out.print(hit.getId() + "~"); System.out.println(hit.getSourceAsString()); } } else { System.out.println("response null~~~"); } if (client != null) { client.close(); } } /* slow */ public static Client buildClientByTransport() throws UnknownHostException { final String CLUSTERNAME = "es-cluster"; String str = "192.168.56.250"; String[] ipStr = str.split("\\."); byte[] ipBuf = new byte[4]; for(int i = 0; i < 4; i++){ ipBuf[i] = (byte)(Integer.parseInt(ipStr[i])&0xff); } Settings settings = Settings.settingsBuilder() .put("cluster.name", CLUSTERNAME).build(); Client client = TransportClient.builder().settings(settings).build() .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("centos1"), 9300)); //.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByAddress(ipBuf), 9300)); return client; } /* very slow */ public static Client buildClientByNode() throws UnknownHostException { /* Run Configurations > Arguments > VM arguments, add "-Des.path.home=/appl/elasticsearch-2.1.1" */ final String CLUSTERNAME = "es-cluster"; Node node = NodeBuilder.nodeBuilder().settings(Settings.settingsBuilder().put("http.enabled", false)). clusterName(CLUSTERNAME).client(true).node(); Client client = node.client(); return client; } public static QueryBuilder buildQuery() { //TermsQueryBuilder queryBuilder = queryByIds(); //FuzzyQueryBuilder queryBuilder = QueryBuilders.fuzzyQuery("empname", "emp"); MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("empname", "emp2"); //WildcardQueryBuilder queryBuilder = QueryBuilders.wildcardQuery("empname", "*emp*"); //QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("-26"); // full text SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); String json = searchSourceBuilder.query(queryBuilder).toString(); System.out.println(json); return queryBuilder; } /* Refer https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-id-field.html */ public static TermsQueryBuilder queryByIds() { Collection coll = new ArrayList(); coll.add(1); coll.add(2); TermsQueryBuilder queryBuilder = QueryBuilders.termsQuery("_id", coll); return queryBuilder; }}3.2 手工Restful连接搜索(Java)
import java.io.BufferedReader;import java.io.DataOutputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import org.elasticsearch.index.query.MatchQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.search.builder.SearchSourceBuilder;/* Implement RestFul manually (fast) * Refer * http://stackoverflow.com/questions/33889866/how-to-send-url-request-with-json-to-elasticsearch-using-java * http://blog.csdn.net/dm_vincent/article/details/41693125 * */public class EsQuery02 { public static void main(String[] args) throws Exception { HttpURLConnection conn = null; DataOutputStream wr = null; BufferedReader br = null; StringBuilder resultBuilder = new StringBuilder(); String line = null; try { // 1. Prepare url String url01 = "http://centos1:9200/dept/employee/_search?pretty"; // 2. Prepare query param //String queryParamJson = buildQueryParamByStr(); String queryParamJson = buildQueryParamByAPI(); // 3. Inject url URL url = new URL(url01); conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Content-Length", Integer.toString(queryParamJson.getBytes().length)); conn.setRequestProperty("Content-Language", "en-US"); conn.setUseCaches(false); conn.setDoOutput(true); // 4. Inject query param wr = new DataOutputStream ( conn.getOutputStream()); wr.writeBytes(queryParamJson); // Connection failure handling if (conn.getResponseCode() != 200) { throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode()); } // 5. Get Response br = new BufferedReader(new InputStreamReader( (conn.getInputStream()))); while ((line = br.readLine()) != null) { resultBuilder.append(line); resultBuilder.append('\r'); } System.out.println("result~~~" + resultBuilder.toString()); } catch (Exception e) { e.printStackTrace(); } finally { if(wr != null) { wr.close(); } if(br != null) { br.close(); } if(conn != null) { conn.disconnect(); } } } public static String buildQueryParamByAPI() { MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("empname", "emp2"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); String queryParamJson = searchSourceBuilder.query(queryBuilder).toString(); System.out.println("json~~~" + queryParamJson); return queryParamJson; } public static String buildQueryParamByStr() { /*curl 'centos1:9200/dept/employee/_search?pretty' -d * '{"query" : {"match" : {"empname" : "emp2"}}}'*/ String queryParamJson = "{\"query\" : {\"match\" : {\"empname\" : \"emp2\"}}}"; return queryParamJson; }}3.3 Jest Restful连接搜索(Java)
import org.elasticsearch.index.query.MatchQueryBuilder;import org.elasticsearch.index.query.QueryBuilders;import org.elasticsearch.search.builder.SearchSourceBuilder;import io.searchbox.client.JestClientFactory;import io.searchbox.client.config.HttpClientConfig;import io.searchbox.client.http.JestHttpClient;/* Implement RestFul by Jest * Refer: * http://www.searchly.com/documentation/developer-api-guide/java-jest/ * http://www.cnblogs.com/huangfox/p/3542858.html * http://www.169it.com/article/13172689366007246587.html * https://github.com/searchbox-io/Jest/tree/master/jest * download: https://oss.sonatype.org/content/groups/public/io/searchbox/jest/2.0.2/ * mvn: http://www.searchly.com/documentation/developer-api-guide/java-jest/ * */public class EsQuery03 { /* String connUrl = "http://centos1:9200"; public static void main(String[] args) { // 1. connect JestClient client = getClient(); // 2. prepare query param String queryParamJson = buildQueryParamByAPI(); // 3. search SearchResult result = search(client, queryParamJson); // 4. get response getContent(); } public static JestClient getClient() { JestClientFactory factory = new JestClientFactory(); factory.setHttpClientConfig(new HttpClientConfig .Builder(connUrl) .multiThreaded(true) .build()); JestClient client = factory.getObject(); return client; } public static String buildQueryParamByAPI(String queryParamJson) { MatchQueryBuilder queryBuilder = QueryBuilders.matchQuery("empname", "emp2"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(queryBuilder); return searchSourceBuilder.toString(); } public static String buildQueryParamByStr() { String queryParamJson = "{\"query\" : {\"match\" : {\"empname\" : \"emp2\"}}}"; return queryParamJson; } public static SearchResult search(JestClient client, String queryParamJson) { Search search = (Search) new Search.Builder(queryParamJson) // multiple index or types can be added. .addIndex("dept") .addType("employee") .build(); //JestResult result = client.execute(search); SearchResult result = client.execute(search); return result; } public static void getContent() { //List3.4 其它(如JS) // https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/browser-builds.html // http://download.csdn.net/detail/rongyongfeikai2/8102371 // http://www.elasticui.com/ // http://www.searchly.com/documentation/developer-api-guide/node-js/ -------- 插件 http://ju.outofmemory.cn/entry/50615articles = result.getSourceAsObjectList(Article.class); //List > hits = searchResult.getHits(Article.class); } */}