Java對接ElasticSearch6.7

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調整實現方式,有不對或者出入的地方,歡迎大傢俬信,共同探討

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章