elasticsearch 使用Elasticsearch和Java进行聚合
我是ES新手,现在我有了基本的查询和批量插入。我想添加一个聚合来计算整个数据库中出现的单词对,以便以后计算单词密度 数据具有以下格式:-elasticsearch 使用Elasticsearch和Java进行聚合,elasticsearch,java,elasticsearch,Java,我是ES新手,现在我有了基本的查询和批量插入。我想添加一个聚合来计算整个数据库中出现的单词对,以便以后计算单词密度 数据具有以下格式:- PartNumber, ShopName, WordPair, WordPairCount. 我不确定如何用Java编写聚合。我希望最终结果如下: 之前(默认) 聚合后 A3003, Smiths Shop, 30cm plate, 2 A3001, Johns Shop, 30cm plate, 2 A3005, Johns Shop, 15cm pla
PartNumber, ShopName, WordPair, WordPairCount.
我不确定如何用Java编写聚合。我希望最终结果如下:
之前(默认)
聚合后
A3003, Smiths Shop, 30cm plate, 2
A3001, Johns Shop, 30cm plate, 2
A3005, Johns Shop, 15cm plate, 1
加载数据时,计数设置为1,然后我想运行一个聚合,以有效地将PartNumber、ShopName和key上的默认计数相加。因此,最终数据将显示,15cm钢板未被广泛销售,但30cm钢板被广泛销售(在两家商店)
在SQL中,这将是一个简单的GROUPBY,并在联接上进行更新。但是我发现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
您可以使用以下选项:
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
SearchRequestBuilder SearchRequestBuilder=elasticsearchTemplate.client.prepareSearch(索引的名称)
.SETINDEX(索引的名称)
.setTypes(类型的名称)
.addAggregation(AggregationBuilders.terms(“groupByWordPair”)
.field(“字对”).size(0)
SearchResponse SearchResponse=searchRequestBuilder.execute().actionGet()
StringTerms StringTerms=searchResponse?.aggregations?.asMap?.get(“groupByWordPair”)
列表bucketList=stringTerms?.bucket
上面找到的桶列表
将包含桶的列表
。每个bucket
将key
作为字对,将docCount
作为其计数
希望这有帮助。如果您使用groupByWordPair,上面的结果会出现,因为30厘米有2个计数,15厘米有1个计数。这就是您想要实现的吗?我添加了sql以澄清我的请求。您想要在java中的字对上聚合??是的,使用ES(和java)。
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