您的位置:首页 > 编程语言 > Java开发

Java - Elasticsearch RestFul连接搜索查询

2016-03-29 13:46 525 查看
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() {
//List<Article> articles = result.getSourceAsObjectList(Article.class);
//List<SearchResult.Hit<Article, Void>> hits = searchResult.getHits(Article.class);
}
*/
}


3.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/50615
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: