Spring boot integrates elasticsearch

elasticsearch

Introduction

A certain call: ElasticSearch is a search server based on Lucene. It provides a distributed multi-user capable full-text search engine based on a RESTful web interface. Elasticsearch, developed in Java and released as open source under the terms of the Apache license, is currently a popular enterprise-grade search engine. Designed for cloud computing, it can achieve real-time search, stable, reliable, fast, and easy to install and use. We build a website or an application, and we want to add search functionality, but it is very difficult to create a search job. We want our search solution to be fast, we want to have a zero-configuration and a completely free search mode, we want to be able to simply use JSON to index data over HTTP, we want our search server to be always available, we want to be able to Starting from one and expanding to hundreds, we want real-time search, we want simple multi-tenancy, and we want to build a cloud solution. So we use Elasticsearch to solve all these problems and many more that may arise.

Code practice

The version number of SpringBoot used in this article is 2.1.0.RELEASE, the version number of es on the server side is 6.8.2, and the version number of Elastic Java High Level Rest Client recommended by the client is 6.8.2, which is convenient for the SpringBoot version compatible.

The biggest highlight of es is that the query is very rich, and the target data can be quickly searched out of hundreds of millions of data. How can the query be realized? see below

Single condition precision query:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Single condition exact query
     * @throws IOException
     */
    @Test
    public void search0() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.termsQuery("name", "Zhao Li"));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Multi-condition precise query, union:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Multi-condition precise query, take union
     * @throws IOException
     */
    @Test
    public void search1() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.termsQuery("name", "Zhang", "Chen"));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Range query:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Range query, including from, to
     * @throws IOException
     */
    @Test
    public void search2() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.rangeQuery("age").from(20).to(32));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }


    /**
     * Range query, excluding from, to
     * @throws IOException
     */
    @Test
    public void search3() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.rangeQuery("age").from(20, false).to(30, false));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }


    /**
     * Range query, lt: less than, gt: greater than
     * @throws IOException
     */
    @Test
    public void search4() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.rangeQuery("age").lt(30).gt(20));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Fuzzy query, support wildcards:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Fuzzy query, support wildcards
     * @throws IOException
     */
    @Test
    public void search5() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.wildcardQuery("name","Zhang San"));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Fuzzy query without wildcards, matching left and right:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Fuzzy query without wildcards, left and right matching
     * @throws IOException
     */
    @Test
    public void search6() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.queryStringQuery("Zhang San").field("name"));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Multi-field fuzzy query:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Multi-field fuzzy query
     * @throws IOException
     */
    @Test
    public void search7() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.multiMatchQuery("long", "name", "city"));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Search by page:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Page search
     * @throws IOException
     */
    @Test
    public void search8() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .from(0).size(2);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Field ordering:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * For sorting, the type of the field must be: integer, double, long or keyword
     * @throws IOException
     */
    @Test
    public void search9() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .sort("createTime", SortOrder.ASC);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Accurately count the number of filtered documents:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Accurately count the number of filtered documents, and the query performance is reduced
     * @throws IOException
     */
    @Test
    public void search10() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .trackTotalHits(true);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Set source field filter returns:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Set source field filtering, which fields are included in the first parameter result set, and which fields are not included in the second parameter
     * @throws IOException
     */
    @Test
    public void search11() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .fetchSource(new String[]{<!-- -->"name","age","city","createTime"},new String[]{<!-- ->});

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

Exact match by id:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Exact match by id
     * @throws IOException
     */
    @Test
    public void search12() throws IOException {<!-- -->
        String[] ids = new String[]{<!-- -->"1","2"};
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.termsQuery("_id", ids));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }

}

matchAllQuery searches all:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * matchAllQuery search all
     * @throws IOException
     */
    @Test
    public void search21() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.matchAllQuery());

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }
}

match Search matches:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * match search match
     * @throws IOException
     */
    @Test
    public void search22() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder()
                .query(QueryBuilders.matchQuery("name", "Zhang Wang"));

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }
}

bool combination query:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * bool combined query
     * @throws IOException
     */
    @Test
    public void search23() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder();

        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.must(QueryBuilders.matchQuery("name", "Zhang Wang"));
        boolQueryBuilder.must(QueryBuilders.rangeQuery("age").lte(30).gte(20));
        builder. query(boolQueryBuilder);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }
}

nested type nested query:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * nested type nested query
     * @throws IOException
     */
    @Test
    public void search24() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder();

        //Condition query
        BoolQueryBuilder mainBool=new BoolQueryBuilder();
        mainBool.must(QueryBuilders.matchQuery("name", "Zhao Liu"));

        //nested type nested query
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.must(QueryBuilders.matchQuery("products.brand", "A"));
        boolQueryBuilder.must(QueryBuilders.matchQuery("products.title", "chocolate"));
        NestedQueryBuilder nested = QueryBuilders.nestedQuery("products", boolQueryBuilder, ScoreMode.None);
        mainBool. must(nested);

        builder. query(mainBool);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }
}

Multiple criteria query + sorting + pagination:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * Multi-condition query + sorting + pagination
     * @throws IOException
     */
    @Test
    public void search29() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder();

        //Conditional search
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.must(QueryBuilders.matchQuery("name", "Zhang Wang"));
        boolQueryBuilder.must(QueryBuilders.rangeQuery("age").lte(30).gte(20));
        builder. query(boolQueryBuilder);

        //result collection pagination
        builder.from(0).size(2);

        //sort
        builder.sort("createTime",SortOrder.ASC);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }
}

Aggregation query – sum:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * aggregate query sum
     * @throws IOException
     */
    @Test
    public void search30() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder();

        //Conditional search
        builder.query(QueryBuilders.matchAllQuery());
        // aggregate query
        AggregationBuilder aggregation = AggregationBuilders.sum("sum_age").field("age");
        builder. aggregation(aggregation);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }
}

Aggregation Query – Average:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * aggregate query avg
     * @throws IOException
     */
    @Test
    public void search31() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder();

        //Conditional search
        builder.query(QueryBuilders.matchAllQuery());
        // aggregate query
        AggregationBuilder aggregation = AggregationBuilders.avg("avg_age").field("age");
        builder. aggregation(aggregation);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }
}

Aggregation Query – Count:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * aggregate query count
     * @throws IOException
     */
    @Test
    public void search32() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder();

        //Conditional search
        builder.query(QueryBuilders.matchAllQuery());
        // aggregate query
        AggregationBuilder aggregation = AggregationBuilders.count("count_age").field("age");
        builder. aggregation(aggregation);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }
}

Aggregation query-grouping:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = ElasticSearchApplication. class)
public class SearchJunit {<!-- -->

    @Autowired
    private RestHighLevelClient client;

    /**
     * aggregate query grouping
     * @throws IOException
     */
    @Test
    public void search33() throws IOException {<!-- -->
        // create request
        SearchSourceBuilder builder = new SearchSourceBuilder();

        //Conditional search
        builder.query(QueryBuilders.matchAllQuery());
        // aggregate query
        AggregationBuilder aggregation = AggregationBuilders.terms("tag_createTime").field("createTime")
                .subAggregation(AggregationBuilders.count("count_age").field("age")) //count
                .subAggregation(AggregationBuilders.sum("sum_age").field("age")) //Sum
                .subAggregation(AggregationBuilders.avg("avg_age").field("age")); //Average

        builder. aggregation(aggregation);

        // do not output raw data
        builder. size(0);

        //search
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("cs_index");
        searchRequest.types("_doc");
        searchRequest.source(builder);
        // execute the request
        SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
        // parse the query result
        System.out.println(response.toString());
    }
}

Summary

Introduction to SpringBoot’s integration of ElasticSearch for various advanced queries