SpringBoot整合Elasticsearch-Rest-Client、测试保存、复杂检索

三连哦

前言

1、9300:TCP

  • spring-data-elasticsearch:transport-api.jar;
    • springboot 版本不同, transport-api.jar 不同,不能适配 es 版本
    • 7.x 已经不建议使用,8 以后就要废弃

2、9200:HTTP

  • JestClient:非官方,更新慢
  • RestTemplate:模拟发 HTTP 请求,ES 很多操作需要自己封装,麻烦
  • HttpClient:同上
  • Elasticsearch-Rest-Client:官方 RestClient,封装了 ES 操作,API 层次分明,上手简单最终选择 Elasticsearch-Rest-Client(elasticsearch-rest-high-level-client)

https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

1、SpringBoot 整合

1.1 pom文件

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.4.2</version>
</dependency>

这里进行了版本管理、主动设置版本号

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    <elasticsearch.version>7.4.2</elasticsearch.version>
</properties>

查看导入的依赖
在这里插入图片描述


1.2 配置类

/**
 * @author zyz
 * @version 1.0
 * @data 2023/3/14 22:02
 * @Description:
 */

@Configuration
public class GulimallElasticSearchConfig {
    
    

    public static final RequestOptions COMMON_OPTIONS;

    static{
    
    
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        COMMON_OPTIONS = builder.build();
    }

    @Bean
    public RestHighLevelClient esRestClient() {
    
    
        RestClientBuilder builder = null;
        builder = RestClient.builder(new HttpHost("192.168.202.211", 9200, "http"));
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;

    }
}

1.3 测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class GulimallSearchApplicationTests {
    
    

    @Autowired
    private RestHighLevelClient client;

    @Test
    public void contextLoads() {
    
    
        System.out.println(client);
    }

}

测试结果
在这里插入图片描述

2、测试保存

1.1 保存数据到es

1.1.1 代码逻辑

@RunWith(SpringRunner.class)
@SpringBootTest
public class GulimallSearchApplicationTests {
    
    

    @Autowired
    private RestHighLevelClient client;

    /**
     * 测试存储数据到es
     * @throws IOException
     */
    @Test
    public void indexData() throws IOException {
    
    
        IndexRequest indexRequest = new IndexRequest("users");
        indexRequest.id("1");
        User user = new User();
        user.setUserName("lisi");
        user.setAge(18);
        user.setGender("男");
        String jsonString = JSON.toJSONString(user);
        indexRequest.source(jsonString, XContentType.JSON);

        //执行
        IndexResponse index = client.index(indexRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);

        //提取
        System.out.println(index);


    }

    @Data
    class User{
    
    
        private String userName;
        private String gender;
        private Integer age;
    }


}

1.1.2 测试结果

在这里插入图片描述

未执行代码前、查看索引下的值。此时并未对应索引
在这里插入图片描述
执行代码后、再次查询:
在这里插入图片描述

1.2 复杂检索(查询address中包含mill的)

这里构建的代码检索条件以及如何构建其中的参数,参数对标哪些数据,根据如下图检索条件进行配置。
在这里插入图片描述

1.2.1 代码逻辑

    @Test
    public void searchData() throws IOException {
    
    

        //1. 创建检索请求
        SearchRequest searchRequest = new SearchRequest();

        //1.1)指定索引
        searchRequest.indices("bank");
        //1.2)构造检索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("address", "Mill"));
        System.out.println("执行条件:"+sourceBuilder.toString());

        searchRequest.source(sourceBuilder);

        //2、执行检索
        SearchResponse searchResponse = client.search(searchRequest,GulimallElasticSearchConfig.COMMON_OPTIONS);
        //3、分析结果
        System.out.println("检索结果:" + searchResponse.toString());


    }

1.2.2 测试结果

在这里插入图片描述

格式化查询条件

执行条件:
{
    
    
	"query": {
    
    
		"match": {
    
    
			"address": {
    
    
				"query": "Mill",
				"operator": "OR",
				"prefix_length": 0,
				"max_expansions": 50,
				"fuzzy_transpositions": true,
				"lenient": false,
				"zero_terms_query": "NONE",
				"auto_generate_synonyms_phrase_query": true,
				"boost": 1.0
			}
		}
	}
}

格式化查询结果

检索结果:和用工具查出来的效果是一样的

{
    
    
	"took": 5,
	"timed_out": false,
	"_shards": {
    
    
		"total": 1,
		"successful": 1,
		"skipped": 0,
		"failed": 0
	},
	"hits": {
    
    
		"total": {
    
    
			"value": 4,
			"relation": "eq"
		},
		"max_score": 5.4032025,
		"hits": [
			{
    
    
				"_index": "bank",
				"_type": "account",
				"_id": "970",
				"_score": 5.4032025,
				"_source": {
    
    
					"account_number": 970,
					"balance": 19648,
					"firstname": "Forbes",
					"lastname": "Wallace",
					"age": 28,
					"gender": "M",
					"address": "990 Mill Road",
					"employer": "Pheast",
					"email": "[email protected]",
					"city": "Lopezo",
					"state": "AK"
				}
			},
			{
    
    
				"_index": "bank",
				"_type": "account",
				"_id": "136",
				"_score": 5.4032025,
				"_source": {
    
    
					"account_number": 136,
					"balance": 45801,
					"firstname": "Winnie",
					"lastname": "Holland",
					"age": 38,
					"gender": "M",
					"address": "198 Mill Lane",
					"employer": "Neteria",
					"email": "[email protected]",
					"city": "Urie",
					"state": "IL"
				}
			},
			{
    
    
				"_index": "bank",
				"_type": "account",
				"_id": "345",
				"_score": 5.4032025,
				"_source": {
    
    
					"account_number": 345,
					"balance": 9812,
					"firstname": "Parker",
					"lastname": "Hines",
					"age": 38,
					"gender": "M",
					"address": "715 Mill Avenue",
					"employer": "Baluba",
					"email": "[email protected]",
					"city": "Blackgum",
					"state": "KY"
				}
			},
			{
    
    
				"_index": "bank",
				"_type": "account",
				"_id": "472",
				"_score": 5.4032025,
				"_source": {
    
    
					"account_number": 472,
					"balance": 25571,
					"firstname": "Lee",
					"lastname": "Long",
					"age": 32,
					"gender": "F",
					"address": "288 Mill Street",
					"employer": "Comverges",
					"email": "[email protected]",
					"city": "Movico",
					"state": "MT"
				}
			}
		]
	}
}

1.3 复杂检索(聚合,薪资平均值)

在这里插入图片描述

1.3.1 代码逻辑

    @Test
    public void searchData() throws IOException {
    
    

        //1. 创建检索请求
        SearchRequest searchRequest = new SearchRequest();

        //1.1)指定索引
        searchRequest.indices("bank");
        //1.2)构造检索条件
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchQuery("address", "Mill"));

        //1.2.1)按照年龄分布进行聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
        sourceBuilder.aggregation(ageAgg);

        //1.2.2)计算平均年龄
        AvgAggregationBuilder ageAvg = AggregationBuilders.avg("ageAvg").field("age");
        sourceBuilder.aggregation(ageAvg);

        //1.2.3)计算平均薪资
        AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
        sourceBuilder.aggregation(balanceAvg);

        System.out.println("执行条件:"+sourceBuilder.toString());

        searchRequest.source(sourceBuilder);

        //2、执行检索
        SearchResponse searchResponse = client.search(searchRequest,GulimallElasticSearchConfig.COMMON_OPTIONS);
        //3、分析结果
        System.out.println("检索结果:" + searchResponse.toString());


    }

1.3.2 检测结果

控制台效果:
在这里插入图片描述
格式化检索条件

执行条件:

{
    
    
	"query": {
    
    
		"match": {
    
    
			"address": {
    
    
				"query": "Mill",
				"operator": "OR",
				"prefix_length": 0,
				"max_expansions": 50,
				"fuzzy_transpositions": true,
				"lenient": false,
				"zero_terms_query": "NONE",
				"auto_generate_synonyms_phrase_query": true,
				"boost": 1.0
			}
		}
	},
	"aggregations": {
    
    
		"ageAgg": {
    
    
			"terms": {
    
    
				"field": "age",
				"size": 10,
				"min_doc_count": 1,
				"shard_min_doc_count": 0,
				"show_term_doc_count_error": false,
				"order": [
					{
    
    
						"_count": "desc"
					},
					{
    
    
						"_key": "asc"
					}
				]
			}
		},
		"ageAvg": {
    
    
			"avg": {
    
    
				"field": "age"
			}
		},
		"balanceAvg": {
    
    
			"avg": {
    
    
				"field": "balance"
			}
		}
	}
}

格式化查询结果

检索结果:
{
    
    
	"took": 2,
	"timed_out": false,
	"_shards": {
    
    
		"total": 1,
		"successful": 1,
		"skipped": 0,
		"failed": 0
	},
	"hits": {
    
    
		"total": {
    
    
			"value": 4,
			"relation": "eq"
		},
		"max_score": 5.4032025,
		"hits": [
			{
    
    
				"_index": "bank",
				"_type": "account",
				"_id": "970",
				"_score": 5.4032025,
				"_source": {
    
    
					"account_number": 970,
					"balance": 19648,
					"firstname": "Forbes",
					"lastname": "Wallace",
					"age": 28,
					"gender": "M",
					"address": "990 Mill Road",
					"employer": "Pheast",
					"email": "[email protected]",
					"city": "Lopezo",
					"state": "AK"
				}
			},
			{
    
    
				"_index": "bank",
				"_type": "account",
				"_id": "136",
				"_score": 5.4032025,
				"_source": {
    
    
					"account_number": 136,
					"balance": 45801,
					"firstname": "Winnie",
					"lastname": "Holland",
					"age": 38,
					"gender": "M",
					"address": "198 Mill Lane",
					"employer": "Neteria",
					"email": "[email protected]",
					"city": "Urie",
					"state": "IL"
				}
			},
			{
    
    
				"_index": "bank",
				"_type": "account",
				"_id": "345",
				"_score": 5.4032025,
				"_source": {
    
    
					"account_number": 345,
					"balance": 9812,
					"firstname": "Parker",
					"lastname": "Hines",
					"age": 38,
					"gender": "M",
					"address": "715 Mill Avenue",
					"employer": "Baluba",
					"email": "[email protected]",
					"city": "Blackgum",
					"state": "KY"
				}
			},
			{
    
    
				"_index": "bank",
				"_type": "account",
				"_id": "472",
				"_score": 5.4032025,
				"_source": {
    
    
					"account_number": 472,
					"balance": 25571,
					"firstname": "Lee",
					"lastname": "Long",
					"age": 32,
					"gender": "F",
					"address": "288 Mill Street",
					"employer": "Comverges",
					"email": "[email protected]",
					"city": "Movico",
					"state": "MT"
				}
			}
		]
	},
	"aggregations": {
    
    
		"lterms#ageAgg": {
    
    
			"doc_count_error_upper_bound": 0,
			"sum_other_doc_count": 0,
			"buckets": [
				{
    
    
					"key": 38,
					"doc_count": 2
				},
				{
    
    
					"key": 28,
					"doc_count": 1
				},
				{
    
    
					"key": 32,
					"doc_count": 1
				}
			]
		},
		"avg#ageAvg": {
    
    
			"value": 34.0
		},
		"avg#balanceAvg": {
    
    
			"value": 25208.0
		}
	}
}

1.4 优化获取数据

将命中的记录、转化为对象。


    @ToString
    @Data
    static class Account {
    
    
        private int account_number;
        private int balance;
        private String firstname;
        private String lastname;
        private int age;
        private String gender;
        private String address;
        private String employer;
        private String email;
        private String city;
        private String state;
    }

        //3. 将检索结果封装为Bean
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit searchHit : searchHits) {
    
    
            String sourceAsString = searchHit.getSourceAsString();
            Account account = JSON.parseObject(sourceAsString, Account.class);
            System.out.println(account);

        }

测试结果

GulimallSearchApplicationTests.Account(account_number=970, balance=19648, firstname=Forbes, lastname=Wallace, age=28, gender=M, address=990 Mill Road, employer=Pheast, [email protected], city=Lopezo, state=AK)
GulimallSearchApplicationTests.Account(account_number=136, balance=45801, firstname=Winnie, lastname=Holland, age=38, gender=M, address=198 Mill Lane, employer=Neteria, [email protected], city=Urie, state=IL)
GulimallSearchApplicationTests.Account(account_number=345, balance=9812, firstname=Parker, lastname=Hines, age=38, gender=M, address=715 Mill Avenue, employer=Baluba, [email protected], city=Blackgum, state=KY)
GulimallSearchApplicationTests.Account(account_number=472, balance=25571, firstname=Lee, lastname=Long, age=32, gender=F, address=288 Mill Street, employer=Comverges, [email protected], city=Movico, state=MT)

在这里插入图片描述

1.5 获取聚合后的结果

1.5.1 代码逻辑

        //4. 获取聚合信息
        Aggregations aggregations = searchResponse.getAggregations();

        Terms ageAgg1 = aggregations.get("ageAgg");

        for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
    
    
            String keyAsString = bucket.getKeyAsString();
            System.out.println("年龄:" + keyAsString + " ==> " + bucket.getDocCount());
        }
        Avg ageAvg1 = aggregations.get("ageAvg");
        System.out.println("平均年龄:" + ageAvg1.getValue());

        Avg balanceAvg1 = aggregations.get("balanceAvg");
        System.out.println("平均薪资:" + balanceAvg1.getValue());

1.5.2 测试结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43304253/article/details/129915944