ElasticSearch由於版本不同,具體配置會有所差別,本文主要針對ES6.7做一些針對性的配置!小版本不作要求
官方文檔:https://www.elastic.co/guide/en/elasticsearch/client/index.html
在這裏我們選擇JAVA REST Client,小版本在鏈接裏進行切換
此處選用Java High Level REST Client,針對個人喜號,不做強制說明.
右邊鏈接,有相關API:
OK,現在進入JAVA實戰
1.現在配置RestHighLevelClient,代碼如下:
@Component
@Data
public class ESClientConnectionUtil {
@Value("${es.host}")
private String HOST;
@Value("${es.port}")
private int PORT;
public RestHighLevelClient getRestHighLevelClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("10.200.25.160", 9200, "http"))
);
return client;
}
}
2.創建INDEX
@Test
public void createIndex() {
String index = "message";
String result = "成功";
try {
if (!checkIndexExists(index)) {
logger.info("開始新建索引【{}】", index);
CreateIndexRequest request = new CreateIndexRequest(index);
CreateIndexResponse createIndexResponse = esClientConnectionUtil.getRestHighLevelClient().indices().create(request, RequestOptions.DEFAULT);
logger.info("createIndex: {}", JSON.toJSONString(createIndexResponse));
if (!createIndexResponse.isAcknowledged()) {
result = "接口執行失敗";
}
} else {
logger.info("索引【{}】已存在,無需重建", index);
result = "索引【" + index + "】已存在,無需重複創建";
}
} catch (Exception ex) {
logger.error("createIndex 索引創建接口異常,{}", ex);
result = "索引創建接口異常";
}
System.out.println(result);
}
3.刪除index
@Test
public void deleteIndex() throws IOException {
/**
* 返回true是成功 反之失敗
* 如果索引不存在會出異常 Elasticsearch exception [type=index_not_found_exception, reason=no such index]
*/
String index = "message";
//先檢查索引是否存在
if (!checkIndexExists(index)) {
logger.info("索引【{}】不存在,不走刪除邏輯", index);
}
DeleteIndexRequest deleteRequest = new DeleteIndexRequest(index);
logger.info("開始刪除索引,name=【{}】的數據", index);
AcknowledgedResponse dResponse = esClientConnectionUtil.getRestHighLevelClient().indices().delete(deleteRequest, RequestOptions.DEFAULT);
logger.info("刪除後返回結果:{}", dResponse.isAcknowledged());
}
4.驗證索引是否存在
public boolean checkIndexExists(String index) throws IOException {
GetIndexRequest getIndexRequest = new GetIndexRequest(index);
boolean exists = esClientConnectionUtil.getRestHighLevelClient().indices().exists(getIndexRequest, RequestOptions.DEFAULT);
logger.info("驗證索引【{}】是否存在結果爲: {}", index, exists);
return exists;
}
5.插入數據
@Test
public void insertInfo() {
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("merCode", "kmmcs");
jsonMap.put("fromUserId", "me");
jsonMap.put("toUserId", "you");
jsonMap.put("msgUid", System.currentTimeMillis());
jsonMap.put("userId", "10000");
jsonMap.put("timeStamp", new Date());
jsonMap.put("messageType", "TextMessage");
jsonMap.put("coversionType", "Private");
jsonMap.put("content", "kmmces========" + 100);
String index = "message";
String type = "doc";
IndexRequest indexRequest = new IndexRequest(index).id(String.valueOf(100)).type(type).source(jsonMap);
try {
IndexResponse response = esClientConnectionUtil.getRestHighLevelClient().index(indexRequest, RequestOptions.DEFAULT);
logger.info("+++++++++" + response.toString());
} catch (Exception e) {
System.out.println("============" + e);
}
}
6.根據id查詢存儲內容
@Test
public void getInfo() {
String index = "message";
String id = "5";
String type = "doc";
// GetRequest getRequest = new GetRequest();
// GetRequest getRequest = new GetRequest(index);
GetRequest getRequest = new GetRequest(index, type, id);
GetResponse response = null;
try {
response = esClientConnectionUtil.getRestHighLevelClient().get(getRequest, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
logger.info(response.getSourceAsString());
}
7.Multi單數據方式
@Test
public void getMultiInfo() {
String index = "message";
String id = "5";
String type = "doc";
String[] includes = new String[]{"postDate"};
String[] excludes = Strings.EMPTY_ARRAY;
FetchSourceContext fetchSourceContext = new FetchSourceContext(true, includes, excludes);
FetchSourceContext fetchSourceContext2 = new FetchSourceContext(true, excludes, includes);
MultiGetRequest request = new MultiGetRequest();
request.add(new MultiGetRequest.Item(index, type, id));
request.add(new MultiGetRequest.Item(index, type, id).fetchSourceContext(fetchSourceContext));
request.add(new MultiGetRequest.Item(index, type, id).fetchSourceContext(fetchSourceContext2));
request.add(new MultiGetRequest.Item(index, type, id).storedFields("user"));
MultiGetResponse response = null;
try {
response = esClientConnectionUtil.getRestHighLevelClient().mget(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
for (MultiGetItemResponse multiGetItemResponse : response.getResponses()) {
System.out.println(multiGetItemResponse.getResponse().getSourceAsString());
}
}
8.條件查詢存儲內容
@Test
public void getSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder builder = new BoolQueryBuilder();
// builder.must(QueryBuilders.matchQuery("merCode", "123"));
// builder.must(QueryBuilders.matchQuery("userId", "123"));
// QueryBuilders.boolQuery();
// builder.should(QueryBuilders.matchQuery("message", "k"));
searchSourceBuilder.query(builder);
searchSourceBuilder.from(0);//defaults 0
searchSourceBuilder.size(200);//defaults 10
searchSourceBuilder.sort(new FieldSortBuilder("timeStamp").unmappedType("long").order(SortOrder.DESC));
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = esClientConnectionUtil.getRestHighLevelClient().search(searchRequest, RequestOptions.DEFAULT);
RestStatus status = searchResponse.status();
System.out.println(status.getStatus());
System.out.println(status.name());
SearchHits hits = searchResponse.getHits();
for (SearchHit searchHit : hits.getHits()) {
System.out.println(searchHit.getSourceAsString());
}
}
9.Multi方式條件查詢
@Test
public void getMultiSearch() throws IOException {
MultiSearchRequest request = new MultiSearchRequest();
SearchRequest firstSearchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("user", "kimchy"));
searchSourceBuilder.from(0);
searchSourceBuilder.size(8);
firstSearchRequest.source(searchSourceBuilder);
request.add(firstSearchRequest);
SearchRequest secondSearchRequest = new SearchRequest();
SearchSourceBuilder searchSourceBuilder2 = new SearchSourceBuilder();
BoolQueryBuilder builder = new BoolQueryBuilder();
builder.must(QueryBuilders.matchQuery("user", "kimchy"));
searchSourceBuilder2.query(builder);
searchSourceBuilder2.sort(new FieldSortBuilder("postDate").order(SortOrder.ASC));
secondSearchRequest.source(searchSourceBuilder2);
request.add(secondSearchRequest);
MultiSearchResponse multiSearchResponse = esClientConnectionUtil.getRestHighLevelClient().msearch(request, RequestOptions.DEFAULT);
MultiSearchResponse.Item[] items = multiSearchResponse.getResponses();
for (MultiSearchResponse.Item item : items) {
RestStatus status = item.getResponse().status();
System.out.println(status);
SearchHits hits = item.getResponse().getHits();
for (SearchHit searchHit : hits.getHits()) {
System.out.println(searchHit.getSourceAsString());
}
}
}
總結:根據文檔API調整實現方式,有不對或者出入的地方,歡迎大傢俬信,共同探討