ES is an open source, highly scalable distributed full text search engine that is at the heart of the Elastic Stack. It can store and retrieve data in near real time; Its scalability is very good, can be extended to hundreds of servers, processing PB level of data. Elasticsearch is developed in The Java language, so you can access Elasticsearch using the Java API. The operation method is basically the same as the Http operation

This article has been included on Github: github.com/chenliang15…

Maven rely on

  • Add ES dependencies to POM.xml

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.8.0</version>
        </dependency>
        <! -- ElasticSearch client -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.8.0</version>
        </dependency>
        <! -- ElasticSearch relies on 2.x log4j -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
    </dependency>
    	<dependency>
    		<groupId>com.fasterxml.jackson.core</groupId>
    		<artifactId>jackson-databind</artifactId>
    		<version>2.9.9</version>
    	</dependency>
        <! -- Junit Unit Test -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    Copy the code
  • Error if running

    java.lang.NoSuchMethodError: org.elasticsearch.client.Request.addParameters
    Copy the code

    Create a New Maven project. It is better not to create a SpringBoot project directly. There may be dependency conflicts, so add the above dependencies to the Maven project POM

Link to the ES client

Because the highLevel ES client is used, it is very easy to connect to ES, just through the host and port can be directly connected

public static void main(String[] args) throws IOException {
    RestHighLevelClient esClient = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost".9200."http"))); esClient.close(); }Copy the code

If the code executes correctly and no error is reported, it is properly connected to the ES node and can be performed using the RestHighLevelClient object obtained

The index operation

With maven dependencies, you can link to ES via a Java client, starting with the basic operations of indexing

  • Create indexes

    RestHighLevelClient esClient = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost".9200."http")));@Test
    public void index_create(a) throws IOException {
        // Create index - request object
        CreateIndexRequest request = new CreateIndexRequest("test");
        // Send the request and get the response
        CreateIndexResponse response = esClient.indices().create(request, RequestOptions.DEFAULT);
        boolean acknowledged = response.isAcknowledged();
        // Response status
        System.out.println("Operating state =" + acknowledged);
    }
    Copy the code
  • Index of the query

    RestHighLevelClient esClient = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost".9200."http")));@Test
    public void index_get(a) throws IOException {
    
        GetIndexRequest request = new GetIndexRequest("test");
    
        GetIndexResponse response = esClient.indices().get(request, RequestOptions.DEFAULT);
    
        System.out.println(Arrays.toString(response.getIndices()));
        System.out.println(response.getMappings());
        System.out.println(response.getSettings());
    }
    Copy the code
  • Remove the index

    RestHighLevelClient esClient = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost".9200."http")));@Test
    public void index_delete(a) throws IOException {
    
        DeleteIndexRequest request = new DeleteIndexRequest("test");
    
        AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
    
        System.out.println(response.isAcknowledged());
    }
    Copy the code

The document operation

Documents, as objects of data, can be manipulated directly through ES’s client objects

The RestHighLevelClient object is created in the same way as the preceding one and is omitted here

Basic Document Operations
  • Create a document

    @Test
    public void doc_create(a) throws IOException {
        IndexRequest request = new IndexRequest();
        // Sets the index of the operation and the ID of the currently inserted document
        request.index("people").id("1001");
    
        User user = new User();
        user.setName("Zhang");
        user.setAge(10);
        user.setSex("Male");
    
        ObjectMapper mapper = new ObjectMapper();
        String userJson = mapper.writeValueAsString(user);
    
        request.source(userJson, XContentType.JSON);
    
        IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
    
        System.out.println(response);
    
        System.out.println("_index" + response.getIndex());
        System.out.println("_id" + response.getId());
        System.out.println("_result" + response.getResult());
    }
    Copy the code
  • Update the document

    @Test
    public void doc_update(a) throws IOException {
        UpdateRequest request = new UpdateRequest();
        request.index("people").id("1001");
    
        request.doc(XContentType.JSON, "sex"."Female");
    
        UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
    
        System.out.println(response);
    }
    Copy the code
  • Query the document

    @Test
    public void doc_get(a) throws IOException {
    
        GetRequest request = new GetRequest();
        request.index("people").id("1001");
    
        GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
    
        System.out.println(response);
        System.out.println(response.getSource());
    }
    Copy the code
  • Delete the document

    @Test
    public void doc_delete(a) throws IOException {
        DeleteRequest request = new DeleteRequest();
        request.index("people").id("1001");
    
        DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }
    Copy the code
Batch Operation of documents

In general, the data of ES is saved or deleted in batches. If the operation is carried out one by one, the efficiency will be very low. The efficiency can be improved through the API of batch operation

  • Batch saving

    @Test
    public void doc_insert_batch(a) throws IOException {
        BulkRequest request = new BulkRequest();
        request.add(new IndexRequest().index("people").id("1001").source(XContentType.JSON, "name"."Zhang"."sex"."Male"."age".10));
        request.add(new IndexRequest().index("people").id("1002").source(XContentType.JSON, "name"."Bill"."sex"."Male"."age".11));
        request.add(new IndexRequest().index("people").id("1003").source(XContentType.JSON, "name"."Fifty"."sex"."Male"."age".12));
        request.add(new IndexRequest().index("people").id("1004").source(XContentType.JSON, "name"."Fifty and 1"."sex"."Male"."age".8));
        request.add(new IndexRequest().index("people").id("1005").source(XContentType.JSON, "name"."Fifty 2"."sex"."Male"."age".9));
        request.add(new IndexRequest().index("people").id("1006").source(XContentType.JSON, "name"."Fifty and 33"."sex"."Male"."age".7));
    
        BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
    
        System.out.println(response.getTook());
        System.out.println(Arrays.toString(response.getItems()));
    }
    Copy the code
  • Batch delete

    @Test
    public void doc_delete_batch(a) throws IOException {
        BulkRequest request = new BulkRequest();
        request.add(new DeleteRequest().index("people").id("1001"));
        request.add(new DeleteRequest().index("people").id("1002"));
        request.add(new DeleteRequest().index("people").id("1003"));
    
        BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
    
        System.out.println(response.getTook());
        System.out.println(response);
    }
    Copy the code

Advanced Document Query

Advanced query, group query, paging, sorting, aggregation operations, as common query operations of ES, THE Java client of ES also provides a user-friendly API for operation

  • Query all data for the specified index

    @Test
    public void match_all(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.matchAllQuery());
    
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("hits========>>");
        for (SearchHit hit : hits) {
            // Displays the results of each query
            System.out.println(hit.getSourceAsString());
        }
        System.out.println("< < = = = = = = = =");
    }
    Copy the code
  • The term query

    @Test
    public void query_term(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.termQuery("age".10));
    
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("hits========>>");
        for (SearchHit hit : hits) {
            // Displays the results of each query
            System.out.println(hit.getSourceAsString());
        }
        System.out.println("< < = = = = = = = =");
    }
    Copy the code
  • Paging query

    @Test
    public void query_page(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.matchAllQuery());
    
        // from specifies the offset from page number, (current page number -1) * size
        builder.from(0);
        builder.size(3);
    
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("hits========>>");
        for (SearchHit hit : hits) {
            // Displays the results of each query
            System.out.println(hit.getSourceAsString());
        }
        System.out.println("< < = = = = = = = =");
    }
    Copy the code
  • Sorting query

    @Test
    public void query_sort(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.matchAllQuery());
    
        builder.sort("age", SortOrder.DESC);
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("hits========>>");
        for (SearchHit hit : hits) {
            // Displays the results of each query
            System.out.println(hit.getSourceAsString());
        }
        System.out.println("< < = = = = = = = =");
    }
    Copy the code
  • Query and filter fields

    @Test
    public void query_filter(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.matchAllQuery());
    
        String[] excludes = {};
        String[] includes = {"name"};
        // Filter fields, which specify that only certain fields are included or that certain fields need to be excluded
        builder.fetchSource(includes, excludes);
    
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("hits========>>");
        for (SearchHit hit : hits) {
            // Displays the results of each query
            System.out.println(hit.getSourceAsString());
        }
        System.out.println("< < = = = = = = = =");
    }
    Copy the code
  • Bool Conditional query, multiple conditions Must

    @Test
    public void query_bool_must(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
    
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    
        // Must -> must be matched
        boolQueryBuilder.must(QueryBuilders.matchQuery("age".10));
        boolQueryBuilder.must(QueryBuilders.matchQuery("sex"."Female"));
    
    
        builder.query(boolQueryBuilder);
    
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("hits========>>");
        for (SearchHit hit : hits) {
            // Displays the results of each query
            System.out.println(hit.getSourceAsString());
        }
        System.out.println("< < = = = = = = = =");
    }
    Copy the code
  • Bool conditional query, multi-condition should

    @Test
    public void query_bool_should(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
    
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    
        // select * from 'should'; // select * from 'should'
        boolQueryBuilder.should(QueryBuilders.matchQuery("age".10));
        boolQueryBuilder.should(QueryBuilders.matchQuery("sex"."Female"));
    
        builder.query(boolQueryBuilder);
    
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("hits========>>");
        for (SearchHit hit : hits) {
            // Displays the results of each query
            System.out.println(hit.getSourceAsString());
        }
        System.out.println("< < = = = = = = = =");
    }
    Copy the code
  • Range queries

    @Test
    public void query_range(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
    
        // Build a range query based on a field
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
    
        // Specify the range of query conditional data
        rangeQueryBuilder.gte(9);
        rangeQueryBuilder.lte(12);
    
        builder.query(rangeQueryBuilder);
    
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("hits========>>");
        for (SearchHit hit : hits) {
            // Displays the results of each query
            System.out.println(hit.getSourceAsString());
        }
        System.out.println("< < = = = = = = = =");
    }
    Copy the code
  • Fuzzy query

    @Test
    public void query_fuzzy(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
    
        // Fuzzy query, specify the field name for fuzzy query, the following specifies the number of fuzzy matching characters
        builder.query(QueryBuilders.fuzzyQuery("name"."Fifty").fuzziness(Fuzziness.ONE));
    
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
    
        SearchHits hits = response.getHits();
        System.out.println("took:" + response.getTook());
        System.out.println("timeout:" + response.isTimedOut());
        System.out.println("total:" + hits.getTotalHits());
        System.out.println("MaxScore:" + hits.getMaxScore());
        System.out.println("hits========>>");
        for (SearchHit hit : hits) {
            // Displays the results of each query
            System.out.println(hit.getSourceAsString());
        }
        System.out.println("< < = = = = = = = =");
    }
    Copy the code
  • Highlighting the query

    @Test
    public void query_highlight(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
        TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("sex"."Female");
    
        // Set the query mode
        builder.query(termsQueryBuilder);
    
        // Build the highlighted field
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<font color='red'>"); // Set the label prefix
        highlightBuilder.postTags("</font>"); // Set the label suffix
        highlightBuilder.field("sex"); // Set the highlighted field
    
        // Set the highlighted query
        builder.highlighter(highlightBuilder);
    
        // Set the request body
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response);
        SearchHits hits = response.getHits();
        System.out.println("took::"+response.getTook());
        System.out.println("time_out::"+response.isTimedOut());
        System.out.println("total::"+hits.getTotalHits());
        System.out.println("max_score::"+hits.getMaxScore());
        System.out.println("hits::::>>");
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            System.out.println(sourceAsString);
            // Prints the highlighted resultMap<String, HighlightField> highlightFields = hit.getHighlightFields(); System.out.println(highlightFields); }}Copy the code
  • Aggregate query – maximum value

    @Test
    public void query_aggs_max(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
    
        // Aggregate query to get the maximum number of age fields
        builder.aggregation(AggregationBuilders.max("maxAge").field("age"));
    
        // Set the request body
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }
    Copy the code
  • Aggregate query – Group query

    @Test
    public void query_aggs_group(a) throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("people");
    
        SearchSourceBuilder builder = new SearchSourceBuilder();
    
        // Aggregate query to get the maximum number of age fields
        builder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));
    
        // Set the request body
        request.source(builder);
    
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.printl	n(response);
    }
    Copy the code

Document advanced query, JavaAPI operation mode and basic grammar and Http operations, just replace the corresponding Http to API, ES can be better in the program for operation, the next together and see how to integrate the SpringBoot and ElasticSearch, Easier manipulation of ES with index data