Elasticserch JAVA API Demo

316 阅读2分钟
package write;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.http.HttpHost;
import org.elasticsearch.action.bulk.BackoffPolicy;
import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.bucket.sampler.Sampler;
import org.elasticsearch.search.aggregations.bucket.sampler.SamplerAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

@Slf4j
public class IndexTest {

    RestHighLevelClient newClient() {
        return new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
    }

    BulkProcessor newBulkProcessor(RestHighLevelClient client) {
        BulkProcessor.Listener listener = new BulkProcessor.Listener() {
            @Override
            public void beforeBulk(long executionId, BulkRequest request) {
//                int numberOfActions = request.numberOfActions();
//                if (log.isDebugEnabled()) {
//                    log.debug("Executing bulk [{}] with {} requests",
//                            executionId, numberOfActions);
//                }
            }

            @Override
            public void afterBulk(long executionId, BulkRequest request,
                                  BulkResponse response) {
                if (response.hasFailures()) {
                    log.warn("Bulk [{}] executed with failures", executionId);
                } else {
                    log.info("Bulk [{}] completed in {} milliseconds",
                            executionId, response.getTook().getMillis());
                }
            }

            @Override
            public void afterBulk(long executionId, BulkRequest request,
                                  Throwable failure) {
                log.error("Failed to execute bulk", failure);
            }
        };

        BulkProcessor.Builder builder = BulkProcessor.builder((request, bulkListener) -> client.bulkAsync(request, RequestOptions.DEFAULT, bulkListener),
                listener);
        builder.setBulkActions(2000);
        builder.setBulkSize(new ByteSizeValue(1L, ByteSizeUnit.MB));
        builder.setConcurrentRequests(5);
        builder.setFlushInterval(TimeValue.timeValueSeconds(10L));
        builder.setBackoffPolicy(BackoffPolicy
                .constantBackoff(TimeValue.timeValueSeconds(1L), 3));

        return builder.build();
    }

    @Test
    void testWrite() throws InterruptedException, IOException {
        String index = "test1";
        //testCreateIndex(index);
        RestHighLevelClient client = newClient();
        BulkProcessor bulkProcessor = newBulkProcessor(client);
        int count = 100;
        for (int i = 0; i < 100000000; i++) {
            String randomAlphanumeric = RandomStringUtils.randomAlphanumeric(200);
            IndexRequest indexRequest = new IndexRequest(index).source(XContentType.JSON, "content", randomAlphanumeric, "time", System.currentTimeMillis());
            bulkProcessor.add(indexRequest);
            for (int j = 0; j < count; j++) {
                bulkProcessor.add(indexRequest);
            }
            count--;
        }
        bulkProcessor.awaitClose(30L, TimeUnit.SECONDS);
    }

    @Test
    void testCreateIndex() throws IOException {
        RestHighLevelClient client = newClient();
        CreateIndexRequest request = new CreateIndexRequest("test1");
        request.settings(Settings.builder()
                .put("index.number_of_shards", 12)
                .put("index.number_of_replicas", 0)
        );
        CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
        log.info("create index {}", createIndexResponse.isAcknowledged());
        client.close();
    }

    @Test
    void testCount() throws IOException {
        RestHighLevelClient client = newClient();
        CountRequest countRequest = new CountRequest("test6");
        countRequest.query(new MatchAllQueryBuilder());
        CountResponse count = client.count(countRequest, RequestOptions.DEFAULT);
        System.out.println(count.getCount());
        client.close();
    }

    @Test
    void testSample() throws IOException {
        RestHighLevelClient client = newClient();
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("time").gte(1658312038698L).lte(1658312038698L);
        TermsAggregationBuilder termsAggregationBuilder = new TermsAggregationBuilder("contents").field("content.keyword").size(100);
        SamplerAggregationBuilder aggBuilder = new SamplerAggregationBuilder("sampler").shardSize(100000)
                .subAggregation(termsAggregationBuilder);

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.boolQuery().filter(rangeQueryBuilder));
        searchSourceBuilder.aggregation(aggBuilder);
        searchSourceBuilder.size(0);
        searchSourceBuilder.timeout(TimeValue.timeValueMillis(100000));
        SearchRequest searchRequest = new SearchRequest();
        log.info("sourceBuilder: {}", searchSourceBuilder);
        searchRequest.source(searchSourceBuilder);
        searchRequest.indices("test6");
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(response.toString());

        Sampler sampler = (Sampler) response.getAggregations().asMap().get("sampler");

        Terms contents = (Terms) sampler.getAggregations().get("contents");
        for (Terms.Bucket bucket : contents.getBuckets()) {
            System.out.println(bucket.getKey());
        }
        client.close();
    }

    @Test
    void testTermAggregation() throws IOException {
        RestHighLevelClient client = newClient();
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("time").gte(1658312030698L).lte(1658312038698L);
        TermsAggregationBuilder termsAggregationBuilder = new TermsAggregationBuilder("contents").field("content.keyword").size(100);
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(new MatchAllQueryBuilder());
        searchSourceBuilder.aggregation(termsAggregationBuilder);
        searchSourceBuilder.timeout(TimeValue.timeValueMillis(10000));
        SearchRequest searchRequest = new SearchRequest();
        log.info("sourceBuilder: {}", searchSourceBuilder);
        searchRequest.source(searchSourceBuilder);
        searchRequest.indices("test6");
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(response.toString());

        Terms contents = (Terms) response.getAggregations().get("contents");
        for (Terms.Bucket bucket : contents.getBuckets()) {
            System.out.println(bucket.getKey());
        }
        client.close();
    }

    @Test
    void testSearch() throws IOException {
        RestHighLevelClient client = newClient();

        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("time").gte(1658312038698L).lte(1658312038698L);
        searchSourceBuilder.query(rangeQueryBuilder);
        searchSourceBuilder.timeout(TimeValue.timeValueMillis(10000));
        SearchRequest searchRequest = new SearchRequest();
        log.info("sourceBuilder: {}", searchSourceBuilder);
        searchRequest.source(searchSourceBuilder);
        searchRequest.indices("test6");
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(response.toString());

        for (SearchHit hit : response.getHits().getHits()) {
            log.info("doc : {}", hit.getSourceAsString());
        }
        client.close();
    }


}