下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch \
聚合【重要】
Elasticsearch中的聚合,包含多种类型,最常用的两种,一个叫桶
,一个叫度量
:
度量(metrics)
分组完成以后,我们一般会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些在ES中称为度量
比较常用的一些度量聚合方式:
-
Avg Aggregation:求平均值
-
Max Aggregation:求最大值
-
Min Aggregation:求最小值
-
Percentiles Aggregation:求百分比
-
Stats Aggregation:同时返回avg、max、min、sum、count等
-
Sum Aggregation:求和
-
Top hits Aggregation:求前几
-
Value Count Aggregation:求总数
pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
建立索引库
@SpringBootTest
@RunWith(SpringRunner.class)
public class ESAppTest {
@Autowired
private ElasticsearchRestTemplate template;
//创建索引
@Test
public void testIndex (){
//创建索引
template.createIndex(ESUser.class);
//mapping设置(设置域的类型)
template.putMapping(ESUser.class);
}
}
9.3.2:保存文档
//保存文档
@Test
public void testSave (){
ESUser doc = new ESUser();
doc.setId(1);
doc.setAddress("武汉纺织大学");
ESUser save = template.save(doc);
}
9.3.3:刪除文档
//删除文档
@Test
public void testDelete (){
template.delete("1",ESUser.class);
}
9.3.4:查询(match_all)
@Test
public void test3(){
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
NativeSearchQuery build = new NativeSearchQueryBuilder()
//指定查询方式
.withQuery(matchAllQueryBuilder)
.build();
SearchHits<ESUser> search = template.search(build, ESUser.class);
//获取总记录数
long totalHits = search.getTotalHits();
System.out.println(totalHits);
//获取文档列表
List<SearchHit<ESUser>> searchHits = search.getSearchHits();
List<ESUser> list =
searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
list.forEach(System.out::println);
}
9.3.5:查询(match)
@Test
public void test4(){
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "我喜欢湖北");
NativeSearchQuery build = new NativeSearchQueryBuilder()
//指定查询方式
.withQuery(matchQueryBuilder)
.build();
SearchHits<ESUser> search = template.search(build, ESUser.class);
//获取总记录数
long totalHits = search.getTotalHits();
System.out.println(totalHits);
//获取文档列表
List<SearchHit<ESUser>> searchHits = search.getSearchHits();
List<ESUser> list =
searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
list.forEach(System.out::println);
}
9.3.6:查询(term)
@Test
public void test5(){
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("address", "湖北");
NativeSearchQuery build = new NativeSearchQueryBuilder()
//指定查询方式
.withQuery(termQueryBuilder)
.build();
SearchHits<ESUser> search = template.search(build, ESUser.class);
//获取总记录数
long totalHits = search.getTotalHits();
System.out.println(totalHits);
//获取文档列表
List<SearchHit<ESUser>> searchHits = search.getSearchHits();
List<ESUser> list =
searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
list.forEach(System.out::println);
}
9.3.7:查询(range)
@Test
public void test6(){
RangeQueryBuilder age = QueryBuilders.rangeQuery("age").lte(36).gte(30);
NativeSearchQuery build = new NativeSearchQueryBuilder()
//指定查询方式
.withQuery(age)
.build();
SearchHits<ESUser> search = template.search(build, ESUser.class);
//获取总记录数
long totalHits = search.getTotalHits();
System.out.println(totalHits);
//获取文档列表
List<SearchHit<ESUser>> searchHits = search.getSearchHits();
List<ESUser> list =
searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
list.forEach(System.out::println);
}
9.3.8:查询(page)
@Test
public void test7(){
RangeQueryBuilder age = QueryBuilders.rangeQuery("age").lte(36).gte(0);
PageRequest pageRequest = PageRequest.of(0, 2);
NativeSearchQuery build = new NativeSearchQueryBuilder()
//指定查询方式
.withQuery(age)
//设置分页信息
.withPageable(pageRequest)
.build();
SearchHits<ESUser> search = template.search(build, ESUser.class);
//获取总记录数
long totalHits = search.getTotalHits();
System.out.println(totalHits);
//获取文档列表
List<SearchHit<ESUser>> searchHits = search.getSearchHits();
List<ESUser> list =
searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
list.forEach(System.out::println);
}
9.3.9:查询(bool)
/** * address 我喜欢湖北 match * should * 30>age>10 range */
@Test
public void test8(){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "我喜欢湖北");
RangeQueryBuilder age = QueryBuilders.rangeQuery("age").gte(10).lte(30);
boolQueryBuilder.should(matchQueryBuilder).should(age);
NativeSearchQuery build = new NativeSearchQueryBuilder()
//指定查询方式
.withQuery(boolQueryBuilder)
.build();
SearchHits<ESUser> search = template.search(build, ESUser.class);
//获取总记录数
long totalHits = search.getTotalHits();
System.out.println(totalHits);
//获取文档列表
List<SearchHit<ESUser>> searchHits = search.getSearchHits();
List<ESUser> list =
searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
list.forEach(System.out::println);
}
9.3.10:查询(high light)
//单域highlight
@Test
public void test9(){
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("address", "我喜欢湖北");
NativeSearchQuery build = new NativeSearchQueryBuilder()
//指定查询方式
.withQuery(matchQueryBuilder)
//设置高亮
.withHighlightBuilder(getHighlightBuilder("address"))
.build();
SearchHits<ESUser> search = template.search(build, ESUser.class);
//获取总记录数
long totalHits = search.getTotalHits();
System.out.println(totalHits);
//获取文档列表
List<SearchHit<ESUser>> searchHits = search.getSearchHits();
List<ESUser> list =
// searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
searchHits.stream().map(hit->{
ESUser esUser = hit.getContent();
//取高亮
Map<String, List<String>> highlightFields = hit.getHighlightFields();
highlightFields.forEach((k,v)->{
String highlightVal = v.get(0);
if("address".equals(k)){
esUser.setAddress(highlightVal);
}
});
return esUser;
}).collect(Collectors.toList());
list.forEach(System.out::println);
}
//多域highlight
@Test
public void test10(){
MatchQueryBuilder addressmatchQueryBuilder = QueryBuilders.matchQuery("address", "我喜欢湖北");
MatchQueryBuilder jobmatchQueryBuilder = QueryBuilders.matchQuery("job", "工程师");
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(addressmatchQueryBuilder).should(jobmatchQueryBuilder);
NativeSearchQuery build = new NativeSearchQueryBuilder()
//指定查询方式
.withQuery(boolQueryBuilder)
//设置高亮
.withHighlightBuilder(getHighlightBuilder("address","job"))
.build();
SearchHits<ESUser> search = template.search(build, ESUser.class);
//获取总记录数
long totalHits = search.getTotalHits();
System.out.println(totalHits);
//获取文档列表
List<SearchHit<ESUser>> searchHits = search.getSearchHits();
List<ESUser> list =
// searchHits.stream().map(hit->hit.getContent()).collect(Collectors.toList());
searchHits.stream().map(hit->{
ESUser esUser = hit.getContent();
//取高亮
Map<String, List<String>> highlightFields = hit.getHighlightFields();
highlightFields.forEach((k,v)->{
String highlightVal = v.get(0);
if("address".equals(k)){
esUser.setAddress(highlightVal);
}
if("job".equals(k)){
esUser.setJob(highlightVal);
}
});
return esUser;
}).collect(Collectors.toList());
list.forEach(System.out::println);
}
// 设置高亮字段
private HighlightBuilder getHighlightBuilder(String... fields) {
// 高亮条件
HighlightBuilder highlightBuilder = new HighlightBuilder(); //生成高亮查询器
for (String field : fields) {
highlightBuilder.field(field);//高亮查询字段
}
highlightBuilder.requireFieldMatch(false); //如果要多个字段高亮,这项要为false
highlightBuilder.preTags("<span style=\"color:red\">"); //高亮设置
highlightBuilder.postTags("</span>");
//下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等
highlightBuilder.fragmentSize(800000); //最大高亮分片数
highlightBuilder.numOfFragments(0); //从第一个分片获取高亮片段
return highlightBuilder;
}