Elasticsearch聚合和分词器

本文详细介绍了Elasticsearch中桶聚合和度量聚合的使用方法,包括如何设置自定义分词器和实现自动补全查询。通过示例展示了如何在IDEA中进行聚合查询,包括搜索请求的构建、聚合结果的解析,以及获取聚合结果的步骤。此外,还探讨了如何配置和应用自定义的拼音过滤器。
摘要由CSDN通过智能技术生成

桶聚合语法

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值