本文共 10370 字,大约阅读时间需要 34 分钟。
Elasticsearch有很多第三方java客户端
org.elasticsearch elasticsearch ${elasticsearch.version} org.elasticsearch.client elasticsearch-rest-high-level-client ${elasticsearch.version}
ESConfig
package com.test.es.config;import org.apache.http.HttpHost;import org.apache.http.client.config.RequestConfig.*;import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;import org.elasticsearch.client.RestClient;import org.elasticsearch.client.RestClientBuilder;import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;import org.elasticsearch.client.RestClientBuilder.RequestConfigCallback;import org.elasticsearch.client.RestHighLevelClient;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.ArrayList;@Configurationpublic class ESConfig { private static String hosts = "10.237.79.147"; //集群地址,多个用,分隔 private static int port = 9200; //使用的端口号 private static String schema = "http"; //使用的协议 private static ArrayList hostList = null; private static int connectTimeOut = 1000;//连接超时时间 private static int socketTimeOut = 30000;//?? private static int connectionRequestTimeOut = 500;//获取连接的超时时间 private static int maxConnectNum = 100;//最大连接数 private static int maxConnectPerRoute = 100;//最大路由连接数 static { hostList = new ArrayList<>(); String[] hostStrs = hosts.split(","); for (String host:hostStrs){ hostList.add(new HttpHost(host,port,schema)); } } @Bean public RestHighLevelClient client(){ RestClientBuilder builder = RestClient.builder((HttpHost[])hostList.toArray(new HttpHost[0])); //异步httpclient连接延时配置 builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() { @Override public Builder customizeRequestConfig(Builder requestConfigBuilder) { requestConfigBuilder.setConnectTimeout(connectTimeOut); requestConfigBuilder.setSocketTimeout(socketTimeOut); requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut); return requestConfigBuilder; } }); //异步httpclient连接数设置 builder.setHttpClientConfigCallback(new HttpClientConfigCallback() { @Override public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) { httpClientBuilder.setMaxConnTotal(maxConnectNum); httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute); return httpClientBuilder; } }); RestHighLevelClient client = new RestHighLevelClient(builder); return client; }}
model(Bean)
package com.test.es.model;import lombok.Data;@Datapublic class Book { private Integer id; private String bookName; private String author;}
@Test
package com.test.es;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.test.es.model.Book;import org.elasticsearch.action.search.SearchRequest;import org.elasticsearch.action.search.SearchResponse;import org.elasticsearch.action.update.UpdateRequest;import org.elasticsearch.action.update.UpdateResponse;import org.elasticsearch.client.RequestOptions;import org.elasticsearch.client.RestHighLevelClient;import org.elasticsearch.common.xcontent.XContentType;import org.elasticsearch.index.query.*;import org.elasticsearch.search.SearchHit;import org.elasticsearch.search.SearchHits;import org.elasticsearch.search.builder.SearchSourceBuilder;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;@SpringBootTest@RunWith(SpringRunner.class)public class test { /*第三种elastic elasticsearch-rest-high-level-client*/ @Autowired private RestHighLevelClient client; @Test public void highLevelClient(){ SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.from(0); sourceBuilder.size(10); //参数1:需要包含的内容;参数2:需要排除的内容 sourceBuilder.fetchSource(new String[]{"id","author","bookName"}, new String[]{}); //QueryBuilders类:创建搜索查询的实用工具类;matchQuery方法:参数1代表field name 参数2代表查询内容 MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("author", "Author"); //??? TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("tag", "体育"); //参数代表field name RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime"); rangeQueryBuilder.gte("2018-01-26T08:00:00Z"); rangeQueryBuilder.lte("2018-01-26T20:00:00Z"); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(matchQueryBuilder); boolQueryBuilder.must(termQueryBuilder); boolQueryBuilder.must(rangeQueryBuilder); sourceBuilder.query(boolQueryBuilder); SearchRequest searchRequest = new SearchRequest("springdataes_index");// searchRequest.types(type); searchRequest.source(sourceBuilder); try { SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); SearchHit[] searchHits = hits.getHits(); for(SearchHit hit:searchHits){ System.out.println("search -> "+hit.getSourceAsString()); JSONObject bookJson = JSONObject.parseObject(hit.getSourceAsString()); Book book = JSON.toJavaObject(bookJson,Book.class); System.out.println(book); } System.out.println(JSON.toJSONString(response)); }catch (IOException e){ e.printStackTrace(); } } @Test public void highLevelClientDemo(){ SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.fetchSource(new String[]{"id", "author", "bookName"}, new String[]{}); MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("author", "Author"); MatchQueryBuilder matchQueryBuilder1 = QueryBuilders.matchQuery("id","2"); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(matchQueryBuilder).must(matchQueryBuilder1); sourceBuilder.query(boolQueryBuilder); //indices: springdataes_index => mysql的数据库 SearchRequest searchRequest = new SearchRequest("springdataes_index"); searchRequest.source(sourceBuilder); try{ SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); SearchHit[] searchHits = hits.getHits(); for(SearchHit hit:searchHits){ System.out.println("search ->"+hit.getSourceAsString()); JSONObject bookJson = JSONObject.parseObject(hit.getSourceAsString()); Book book = JSON.toJavaObject(bookJson,Book.class); System.out.println(book); } }catch (IOException e){ e.printStackTrace(); } } @Test public void highLevelClientdemo1(){ //第一部分 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.fetchSource(new String[]{"log_level","log_thread","log_date","log_class","log_content"}, new String[]{}); MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("log_content","xx1"); BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); boolQueryBuilder.must(matchQueryBuilder); sourceBuilder.query(boolQueryBuilder); //第二部分 //log-2019.11.24 数据库 SearchRequest searchRequest = new SearchRequest("log-2020.01.10"); searchRequest.source(sourceBuilder); try { SearchResponse response = client.search(searchRequest,RequestOptions.DEFAULT); SearchHits hits = response.getHits(); SearchHit[] searchHits = hits.getHits(); for(SearchHit hit:searchHits){ System.out.println("search -> "+hit.getSourceAsString()); /*上节基于ELK的日志搜索 search -> {"log_thread":"restartedMain","log_date":"2019-03-21 09:20:01,104","log_level":"INFO","log_class":"com.xxx.xxx.XXXApplication","log_content":"xx1"} */ } }catch (IOException e){ e.printStackTrace(); } } @Test public void update() throws IOException{ String index = "springdataes_index"; String type = ""; Book update_book = new Book(); update_book.setId(1); update_book.setAuthor("UpdatedAuthor"); UpdateRequest request = new UpdateRequest(index, update_book.getId().toString()); request.doc(JSON.toJSONString(update_book), XContentType.JSON); UpdateResponse updateResponse = client.update(request, RequestOptions.DEFAULT); System.out.println("update: "+JSON.toJSONString(updateResponse)); }}
Java High Level REST Client官网API介绍
转载地址:http://lmtii.baihongyu.com/