桶聚合语法
GET /索引/_search
{ "query": {
"range": {
"字段": {
"条件": //
}
}
},//限定聚合范围
"size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果
"aggs": { // 定义聚合
"聚合名": { //给聚合起个名字
"terms": { // 聚合的类型,按照品牌值聚合,所以选择term
"field": "字段", // 参与聚合的字段
"size": 20 // 希望获取的聚合结果数量
}
}
}
}
度量聚合
GET /索引名/_search
{
"size": 0, // 设置size为0,结果中不包含文档,只包含聚合结果
"aggs": { // 定义聚合
"聚合名": { //给聚合起个名字
"terms": { // 聚合的类型,按照品牌值聚合,所以选择term
"field": "字段", // 参与聚合的字段
"size": 20 // 希望获取的聚合结果数量
},
"aggs": {// 是聚合的子聚合,也就是分组后对每组分别计算
"子聚合名称": {// 聚合名称
"stats": {// 聚合类型,这里stats可以计算min、max、avg等
"field": "score"// 聚合字段,这里是score
}
}
}
}
}
}
声明自定义分词器:
PUT /索引名
{
"settings": {
"analysis": {
"analyzer": {// 自定义分词器
"my_analyzer(自己取与下同)": {// 分词器名称
"tokenizer": "ik_max_word",
"filter": "py(自己定义可以不改)"
}
},
"filter": {// 自定义tokenizer filter
"py(与上面的名字相同,上面改了这里也要更改)": {// 过滤器名称
"type": "pinyin",// 过滤器类型,这里是pinyin
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},
"mappings": {//创建索引
"properties": {
"name": {
"type": "text",
"analyzer": "my_analyzer(上面自己取的名字)",
"search_analyzer": "ik_smart"
}
}
}
}
自动补全查询:
PUT /索引名
{
"settings": {
"analysis": {
"analyzer": {
"text_anlyzer": {
"tokenizer": "ik_max_word",
"filter": "py(同上)"
},
"completion_analyzer": {
"tokenizer": "keyword",
"filter": "py(同上)"
}
},
"filter": {
"py(同上)": {
"type": "pinyin",
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_original": true,
"limit_first_letter_length": 16,
"remove_duplicated_term": true,
"none_chinese_pinyin_tokenize": false
}
}
}
},
"mappings": {
"properties": {
"字段":{
"type": "keyword"
},
"all":{
"type": "text",
"analyzer": "text_anlyzer",
"search_analyzer": "ik_smart"
},
"suggestion":{
"type": "completion",
"analyzer": "completion_analyzer"
}
}
}
}
IDEA上实现聚合
@Bean public RestHighLevelClient client() { return new RestHighLevelClient(RestClient.builder( new HttpHost("ip地址", 端口号) )); } }//首先在启动类上创建连接
@SneakyThrows
@Override
public Map<String, List<String>> getFilters(RequestParams params) {
//1. 准备request
SearchRequest request = new SearchRequest("索引,名");
//2. 准备聚合查询
request.source().aggregation(AggregationBuilders
.terms("桶名")
.field("字段")
.size(10)
.order(BucketOrder.count(false))
);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
//3 解析查询结果
Map<String, List<String>> map = new HashMap<>();
map.put("字段", getAggName(response, "桶名"));
return map;
}
private List<String> getAggName(SearchResponse response, String aggName) {
// 3.1.根据聚合名称获取聚合结果
Terms terms = response.getAggregations().get(aggName);//这里必须手动选择Terms接口
// 3.2.获取buckets
List<? extends Terms.Bucket> buckets =terms.getBuckets();
// 3.3.遍历
List<String> list = new ArrayList<>();
for (Terms.Bucket bucket : buckets) {
// 3.4.获取key
list.add(bucket.getKeyAsString());
}
return list;
}