Master Elasticsearch with Spring Boot: 14 Essential Java API Operations

Learn how to integrate Elasticsearch 7.8 with Spring Boot 2.4, covering essential dependencies, index management, document CRUD, bulk operations, and advanced queries such as pagination, sorting, filtering, highlighting, aggregations, and grouping, all demonstrated with concise Java High-Level REST client code examples.

Spring Full-Stack Practical Cases
Spring Full-Stack Practical Cases
Spring Full-Stack Practical Cases
Master Elasticsearch with Spring Boot: 14 Essential Java API Operations

Environment

Environment: springboot2.4.12 + elasticsearch7.8.0

Elasticsearch is an open-source, distributed, real-time search and analytics engine that allows you to store, search and analyze large volumes of data, commonly used to provide powerful search capabilities for websites or applications.

The Java API is the official client provided by Elasticsearch, enabling Java developers to interact easily with an Elasticsearch server. Below are common methods for using the Java API.

Dependencies

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.elasticsearch</groupId>
  <artifactId>elasticsearch</artifactId>
  <version>7.8.0</version>
</dependency>
<dependency>
  <groupId>org.elasticsearch.client</groupId>
  <artifactId>elasticsearch-rest-high-level-client</artifactId>
  <version>7.8.0</version>
</dependency>

Index Operations

High-level Rest client object

private static RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(new HttpHost("localhost", 9200, "http"))
);

1. Create index

public static void createIndex(String index) throws Exception {
    CreateIndexRequest request = new CreateIndexRequest(index);
    CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
    boolean ack = response.isAcknowledged();
    System.out.println("ack = " + ack);
}

2. View index

public static void viewIndex(String index) throws Exception {
    GetIndexRequest request = new GetIndexRequest(index);
    GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
    System.out.println("aliases: " + response.getAliases() + "
" +
        "mappings: " + response.getMappings() + "
" +
        "settings: " + response.getSettings());
}

3. Delete index

public static void deleteIndex(String index) throws Exception {
    DeleteIndexRequest request = new DeleteIndexRequest(index);
    AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
    System.out.println("ack: " + response.isAcknowledged());
}

Document Operations

1. Create document

public static void createDoc(String index, Users users) throws Exception {
    IndexRequest request = new IndexRequest();
    request.index(index).id("1001");
    ObjectMapper objectMapper = new ObjectMapper();
    String jsonString = objectMapper.writeValueAsString(users);
    request.source(jsonString, XContentType.JSON);
    IndexResponse response = client.index(request, RequestOptions.DEFAULT);
    System.out.println("_index: " + response.getIndex() + "
" +
        "_id: " + response.getId() + "
" +
        "_result: " + response.getResult());
}

2. Update document

public static void updateDoc(String index, String id) throws Exception {
    UpdateRequest request = new UpdateRequest();
    request.index(index).id(id);
    Map<String, Object> source = new HashMap<>();
    source.put("sex", "女");
    request.doc(source, XContentType.JSON);
    UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
    System.out.println("_index: " + response.getIndex() + "
" +
        "_id: " + response.getId() + "
" +
        "_result: " + response.getResult());
}

3. View document

public static void viewDoc(String index, String id) throws Exception {
    GetRequest request = new GetRequest().index(index).id(id);
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    System.out.println("_index: " + response.getIndex() + "
" +
        "_type: " + response.getType() + "
" +
        "_id: " + response.getId() + "
" +
        "source: " + response.getSourceAsString());
}

4. Delete document

public static void deleteDoc(String index, String id) throws Exception {
    DeleteRequest request = new DeleteRequest().index(index).id(id);
    DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
    System.out.println(response.toString());
}

5. Bulk operations

public static void batchOperator(String index) throws Exception {
    BulkRequest request = new BulkRequest();
    request.add(new IndexRequest().index(index).id("1002")
        .source(XContentType.JSON, "name","老六","sex","男","age",20));
    request.add(new IndexRequest().index(index).id("1003")
        .source(XContentType.JSON, "name","外网","sex","女","age",10));
    request.add(new IndexRequest().index(index).id("1004")
        .source(XContentType.JSON, "name","莉莉","sex","女","age",35));
    BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
    System.out.println("took: " + response.getTook() + "
" +
        "items: " + new ObjectMapper().writeValueAsString(response.getItems()));
}

6. Advanced search

public static void highSearch(String index) throws Exception {
    SearchRequest request = new SearchRequest().indices(index);
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.matchAllQuery());
    request.source(builder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println("took: " + response.getTook() + "
" +
        "timeout: " + response.isTimedOut() + "
" +
        "total: " + hits.getTotalHits() + "
" +
        "MaxScore: " + hits.getMaxScore());
    for (SearchHit hit : hits) {
        System.out.println(hit.getSourceAsString());
    }
}

7. Term exact query

public static void highTermSearch(String index) throws Exception {
    SearchRequest request = new SearchRequest().indices(index);
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.termQuery("age", "20"));
    request.source(builder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println("took: " + response.getTook() + "
" +
        "timeout: " + response.isTimedOut() + "
" +
        "total: " + hits.getTotalHits() + "
" +
        "MaxScore: " + hits.getMaxScore());
    for (SearchHit hit : hits) {
        System.out.println(hit.getSourceAsString());
    }
}

8. Pagination query

public static void highPagingSearch(String index) throws Exception {
    SearchRequest request = new SearchRequest().indices(index);
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.matchAllQuery());
    builder.from(1);
    builder.size(2);
    request.source(builder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println("took: " + response.getTook() + "
" +
        "timeout: " + response.isTimedOut() + "
" +
        "total: " + hits.getTotalHits() + "
" +
        "MaxScore: " + hits.getMaxScore());
    for (SearchHit hit : hits) {
        System.out.println(hit.getSourceAsString());
    }
}

9. Pagination & sorting query

public static void highPagingAndSortSearch(String index) throws Exception {
    SearchRequest request = new SearchRequest().indices(index);
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.matchAllQuery());
    builder.from(0);
    builder.size(20);
    builder.sort("age", SortOrder.ASC);
    request.source(builder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println("took: " + response.getTook() + "
" +
        "timeout: " + response.isTimedOut() + "
" +
        "total: " + hits.getTotalHits() + "
" +
        "MaxScore: " + hits.getMaxScore());
    for (SearchHit hit : hits) {
        System.out.println(hit.getSourceAsString());
    }
}

10. Pagination, sorting & field filtering query

public static void highPagingAndSortAndFilterFieldSearch(String index) throws Exception {
    SearchRequest request = new SearchRequest().indices(index);
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.matchAllQuery());
    builder.from(0);
    builder.size(20);
    builder.sort("age", SortOrder.ASC);
    String[] includes = {"name"};
    String[] excludes = {};
    builder.fetchSource(includes, excludes);
    request.source(builder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println("took: " + response.getTook() + "
" +
        "timeout: " + response.isTimedOut() + "
" +
        "total: " + hits.getTotalHits() + "
" +
        "MaxScore: " + hits.getMaxScore());
    for (SearchHit hit : hits) {
        System.out.println(hit.getSourceAsString());
    }
}

11. Range query

public static void highBoolSearch(String index) throws Exception {
    SearchRequest request = new SearchRequest().indices(index);
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.matchAllQuery());
    builder.from(0);
    builder.size(20);
    builder.sort("age", SortOrder.ASC);
    RangeQueryBuilder rangeBuilder = QueryBuilders.rangeQuery("age");
    rangeBuilder.gte(15);
    rangeBuilder.lte(30);
    builder.query(rangeBuilder);
    request.source(builder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println("took: " + response.getTook() + "
" +
        "timeout: " + response.isTimedOut() + "
" +
        "total: " + hits.getTotalHits() + "
" +
        "MaxScore: " + hits.getMaxScore());
    for (SearchHit hit : hits) {
        System.out.println(hit.getSourceAsString());
    }
}

12. Highlight query

public static void highHighLightSearch(String index) throws Exception {
    SearchRequest request = new SearchRequest().indices(index);
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.matchQuery("name", "莉莉"));
    HighlightBuilder highLightBuilder = new HighlightBuilder();
    highLightBuilder.preTags("<font color='red'>");
    highLightBuilder.postTags("</font>");
    highLightBuilder.field("name");
    builder.highlighter(highLightBuilder);
    request.source(builder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println("took: " + response.getTook() + "
" +
        "timeout: " + response.isTimedOut() + "
" +
        "total: " + hits.getTotalHits() + "
" +
        "MaxScore: " + hits.getMaxScore());
    for (SearchHit hit : hits) {
        System.out.println(hit.getSourceAsString() + "
" +
            "highlight: " + hit.getHighlightFields());
    }
}

13. Aggregation query

public static void highAggsSearch(String index) throws Exception {
    SearchRequest request = new SearchRequest().indices(index);
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.aggregation(AggregationBuilders.avg("avg_age").field("age"));
    request.source(builder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println("took: " + response.getTook() + "
" +
        "timeout: " + response.isTimedOut() + "
" +
        "total: " + hits.getTotalHits() + "
" +
        "MaxScore: " + hits.getMaxScore());
    for (SearchHit hit : hits) {
        System.out.println(hit.getSourceAsString());
    }
    System.out.println(((ParsedAvg)response.getAggregations().iterator().next()).getValue());
}

14. Group by query

public static void highGroupSearch(String index) throws Exception {
    SearchRequest request = new SearchRequest().indices(index);
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));
    request.source(builder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    SearchHits hits = response.getHits();
    System.out.println("took: " + response.getTook() + "
" +
        "timeout: " + response.isTimedOut() + "
" +
        "total: " + hits.getTotalHits() + "
" +
        "MaxScore: " + hits.getMaxScore());
    for (SearchHit hit : hits) {
        System.out.println(hit.getSourceAsString());
    }
    System.out.println(response);
}

End of tutorial.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

JavaElasticsearchSpring BootREST APISearch
Spring Full-Stack Practical Cases
Written by

Spring Full-Stack Practical Cases

Full-stack Java development with Vue 2/3 front-end suite; hands-on examples and source code analysis for Spring, Spring Boot 2/3, and Spring Cloud.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.