【问题标题】:Aggregation with Elasticsearch and Java使用 Elasticsearch 和 Java 进行聚合
【发布时间】:2016-02-15 00:50:03
【问题描述】:

我是 ES 新手,现在我可以使用基本查询和批量插入。我想添加一个聚合来计算整个数据库中单词对的出现次数,以便稍后计算单词密度。

数据的形式为 -

PartNumber, ShopName, WordPair, WordPairCount. 

我不确定如何用 Java 编写聚合。我希望最终结果如下:

之前(默认)

A3003, Smiths Shop, 30cm plate, 1
A3001, Johns Shop, 30cm plate, 1
A3005, Johns Shop, 15cm plate, 1

聚合后

A3003, Smiths Shop, 30cm plate, 2
A3001, Johns Shop, 30cm plate, 2
A3005, Johns Shop, 15cm plate, 1

加载数据时计数设置为 1,然后我想运行聚合以有效地将 PartNumber、ShopName 作为键的默认计数相加。因此,最终数据将显示 15cm 盘子 销售量不大,但 30cm 盘子 销售量很大(在两家商店)。

在 SQL 中,这将是一个简单的 group by,并在连接上进行更新。但是我发现 SQL 太慢了。

我没有测试等效的 sql,但我认为它会是 -

update p
    set p.wordpartcount = w.x
from part p
inner join (
    select wordpair, count(*) as x
from part
group by wordpair
) as w on w.wordpair = p.wordpair

【问题讨论】:

  • 如果您使用 groupByWordPair 会出现上述结果,因为 30 cm 有 2 个计数,15cm 有 1 个计数。这是你想要达到的目标吗?
  • 我添加了 sql 来澄清我的请求。
  • 你想在java中的WordPair上聚合??
  • 是的,使用 ES(和 Java)。

标签: elasticsearch java


【解决方案1】:

你可以用这个:

SearchRequestBuilder searchRequestBuilder = elasticsearchTemplate.client.prepareSearch(name_of_index)
            .setIndices(name_of_index)
            .setTypes(name_of_type)
            .addAggregation(AggregationBuilders.terms("groupByWordPair")
            .field("wordPair").size(0))

    SearchResponse searchResponse = searchRequestBuilder.execute().actionGet()
    StringTerms stringTerms = searchResponse?.aggregations?.asMap?.get("groupByWordPair")
    List<StringTerms.Bucket> bucketList = stringTerms?.buckets

上面找到的bucketList 将包含Buckets 的列表。每个bucket 将有key 作为wordPair 和docCount 作为它的计数。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多