Java ElasticSearch 进行词云统计

利用ElasticSearch的分词和聚合功能来对文本中的关键词进行词云统计

本文主要针对微博上的新闻来进行分词和词频统计,最后生成词云。具体代码如下:

 public List wordCloudCount(Class clazz,String keywords){
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.queryStringQuery(keywords));
        TermsAggregationBuilder builder = AggregationBuilders.terms("word_count").field("content").size(30);
        Document document = (Document) clazz.getAnnotation(Document.class);
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withIndices(document.indexName())
                .withTypes(document.type())
                .withQuery(boolQuery)
                .addAggregation(builder)
                .build();
        Aggregations aggregation = elasticsearchTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
            @Override
            public Aggregations extract(SearchResponse searchResponse) {
                return searchResponse.getAggregations();
            }
        });
        StringTerms typeTerm = (StringTerms) aggregation.asMap().get("word_count");
        List<StringTerms.Bucket> bucketList = typeTerm.getBuckets();
        LinkedList<String> wordList = new LinkedList<>();
        for (StringTerms.Bucket bucket1 : bucketList) {
            String type_name = bucket1.getKeyAsString();
            wordList.add(type_name);
        }
        try {
            FileReader fReader = new FileReader("stopwords.txt");
            BufferedReader bufferedReader = new BufferedReader(fReader);
            List<String> list = new ArrayList<String>();
            String readline = "";
            while ((readline=bufferedReader.readLine())!=null){
                list.add(readline);
            }
            wordList.removeIf(list::contains);
        } catch (IOException e) {
            log.info("读取停用词失败");
        }
        return wordList;
    }

采用ES 的tempalte引擎来进行分词和聚合,需要强调的是,分完词之后要对停用词进行过滤,即stopwords.txt中的停用词,最后返回关键词的频率。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个使用Elasticsearch Java API进行分类统计聚合的例子: 假设我们有一个名为“products”的索引,其中包含产品名称和价格字段。我们想要按价格范围对产品进行分类统计,以便了解哪些价格区间的产品最受欢迎。 首先,我们需要创建一个聚合对象: ``` AggregationBuilder aggregation = AggregationBuilders .range("price_ranges") .field("price") .addUnboundedTo(50) .addRange(50, 100) .addRange(100, 200) .addRange(200, 500) .addUnboundedFrom(500); ``` 这个聚合对象将按价格字段对文档进行分类统计,并将它们分成五个范围:小于等于50、50到100、100到200、200到500和大于等于500。现在,我们需要将这个聚合对象添加到我们的搜索请求中: ``` SearchRequest searchRequest = new SearchRequest("products"); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.aggregation(aggregation); searchRequest.source(searchSourceBuilder); ``` 这将创建一个`SearchRequest`对象,将聚合对象添加到`SearchSourceBuilder`中,并将其设置为`SearchRequest`的搜索源。现在,我们可以执行搜索请求并从结果中提取聚合信息: ``` SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); Range rangeAgg = searchResponse.getAggregations().get("price_ranges"); for (Range.Bucket bucket : rangeAgg.getBuckets()) { String key = bucket.getKeyAsString(); long docCount = bucket.getDocCount(); System.out.println("Range: " + key + ", Count: " + docCount); } ``` 这会执行搜索请求,并从响应中提取名为“price_ranges”的聚合对象。我们可以遍历每个范围桶,并提取范围键和文档计数。最后,我们可以将这些信息输出到控制台或将它们用于其他目的。 希望这个例子能够帮助你理解如何使用Elasticsearch Java API进行分类统计聚合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值