package com.atguigu.es.demo;
import com.atguigu.es.demo.pojo.User;
import com.atguigu.es.demo.repository.UserRepository;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.Operator;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedLongTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.IndexOperations;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@SpringBootTest
class EsDemoApplicationTests {
@Autowired
private ElasticsearchRestTemplate restTemplate;
@Autowired
private UserRepository userRepository;
//原生客户端
@Autowired
private RestHighLevelClient restHighLevelClient;
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
@Test
void testRestClient() throws IOException {
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 查询和过滤
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
sourceBuilder.query(boolQueryBuilder);
boolQueryBuilder.must(QueryBuilders.matchQuery("name", "冰冰").operator(Operator.AND));
boolQueryBuilder.filter(QueryBuilders.rangeQuery("age").gte(22).lte(25));
// 排序
sourceBuilder.sort("age", SortOrder.DESC);
// 分页
sourceBuilder.from(2);
sourceBuilder.size(2);
// 高亮
sourceBuilder.highlighter(new HighlightBuilder().field("name").preTags("<em>").postTags("</em>"));
// 结果集过滤
sourceBuilder.fetchSource(new String[]{"id", "name", "age"}, null);
// 聚合
sourceBuilder.aggregation(AggregationBuilders.terms("genderAgg").field("gender"));
System.out.println(sourceBuilder);
SearchResponse response = this.restHighLevelClient.search(new SearchRequest(new String[]{"user"}, sourceBuilder), RequestOptions.DEFAULT);
System.out.println(response);
// 搜索结果集对象
org.elasticsearch.search.SearchHits searchHits = response.getHits();
System.out.println("总共命中的记录数:" + searchHits.getTotalHits());
org.elasticsearch.search.SearchHit[] hitsHits = searchHits.getHits();
for (org.elasticsearch.search.SearchHit hitsHit : hitsHits) {
String json = hitsHit.getSourceAsString();
User user = OBJECT_MAPPER.readValue(json, User.class);
System.out.println(user);
// 获取高亮结果集
Map<String, HighlightField> highlightFields = hitsHit.getHighlightFields();
HighlightField highlightField = highlightFields.get("name");
user.setName(highlightField.getFragments()[0].string());
System.out.println(user);
}
// 聚合结果集
Aggregations aggregations = response.getAggregations();
ParsedLongTerms genderAgg = aggregations.get("genderAgg");
List<? extends Terms.Bucket> buckets = genderAgg.getBuckets();
buckets.forEach(bucket -> {
System.out.println("桶的名称:" + bucket.getKeyAsNumber().longValue());
System.out.println("桶的名称:" + bucket.getKeyAsString());
System.out.println("桶的元素数量:" + bucket.getDocCount());
});
}
@Test
void testSearch() {
//原生搜索查询构建器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//匹配查询
queryBuilder.withQuery(QueryBuilders.matchQuery("name", "柳岩"));
//过滤查询
queryBuilder.withFilter(QueryBuilders.rangeQuery("age").gte(22).lte(25));
//排序查询
queryBuilder.withSort(SortBuilders.fieldSort("age").order(SortOrder.DESC));
//分页查询 分页条件:1-页码,从0开始(pageNum-1), 2-pageSize每页显示几条
queryBuilder.withPageable(PageRequest.of(2, 2));
//高亮查询
queryBuilder.withHighlightBuilder(new HighlightBuilder().field("name").preTags("<em>").postTags("</em>"));
//结果集过滤
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id", "name", "age"}, null));
//聚合查询
queryBuilder.addAggregation(AggregationBuilders.terms("genderAgg").field("gender"));
//获取结果集
SearchHits<User> searchHits = this.restTemplate.search(queryBuilder.build(), User.class);
//解析查询结果集
System.out.println("总共命中记录数" + searchHits.getTotalHits());
//获取结果集列表
List<SearchHit<User>> hitList = searchHits.getSearchHits();
hitList.forEach(hit -> {
//获取普通结果集
User user = hit.getContent();
System.out.println(user);
//设置高亮结果集
user.setName(hit.getHighlightField("name").get(0));
System.out.println(user);
});
//解析聚合结果集
Aggregations aggregations = searchHits.getAggregations();
ParsedLongTerms genderAgg = aggregations.get("genderAgg");
//获取桶的集合
List<? extends Terms.Bucket> buckets = genderAgg.getBuckets();
buckets.forEach(bucket ->{
System.out.println("桶的名称"+bucket.getKeyAsNumber().longValue());
System.out.println("桶的元素数量"+bucket.getDocCount());
});
}
@Test
void contextLoads() {
IndexOperations indexOps = this.restTemplate.indexOps(User.class);
if (!indexOps.exists()) {
indexOps.create();
}
indexOps.putMapping(indexOps.createMapping());
}
@Test
void testCURD() {
//添加
//this.userRepository.save(new User(1l,"柳岩","123213",20,false));
this.userRepository.saveAll(Arrays.asList(
new User(1l, "柳岩", "123213", 20, false),
new User(2l, "刘冰冰", "123213", 22, false),
new User(3l, "李冰冰", "123213", 23, false),
new User(4l, "张三", "123213", 24, false),
new User(5l, "李四", "123213", 25, false),
new User(6l, "王冰冰", "123213", 26, false)
));
//删除
this.userRepository.deleteById(1l);
}
}
SpringData-Elasticsearch——SDE综合案例
最新推荐文章于 2022-04-28 05:32:38 发布