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