2016-02-14 1 views
0

Je suis nouveau à ES et maintenant j'ai des requêtes de base et des insertions en vrac de travail. Je veux ajouter une agrégation pour compter les occurrences de paires de mots dans la base de données entière pour calculer les densités de mots plus tard.Agrégation avec Elasticsearch et Java

Les données a la forme -

PartNumber, ShopName, WordPair, WordPairCount. 

Je ne suis pas sûr comment écrire l'agrégation en Java. Je veux que les résultats finaux sont les suivants:

Avant (par défaut)

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

Après agrégation

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

Les données sont chargées avec les comptes mis à un, puis je veux exécutez une agrégation pour additionner efficacement les comptes par défaut sur la référence PartNumber, ShopName. Par conséquent, les données finales montreront que la plaque 15cm n'est pas largement vendue mais la plaque 30cm est largement vendue (dans les deux magasins).

En SQL, ce serait un groupe simple avec une mise à jour sur une jointure. Mais SQL est trop lent comme je l'ai découvert.

Je n'ai pas testé l'équivalent sql mais je pense que ce serait -

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 
+0

Le résultat ci-dessus viendra si vous faites groupByWordPair car il y a 2 count pour 30 cm et 1 pour 15cm. Est-ce ce que vous voulez accomplir? – Richa

+0

J'ai ajouté le sql pour clarifier ma demande. –

+0

Vous voulez agréger sur WordPair en Java? – Richa

Répondre

0

Vous pouvez utiliser ceci:

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 trouvé ci-dessus contient la liste des Buckets. Chaque bucket aura comme key comme wordPair et docCount comme son compte.

Espérons que cela aide.