2016-02-14 3 views
0

Я новичок в ES, и теперь у меня есть основные запросы и объемные вставки. Я хочу добавить агрегацию для подсчета вхождения слов в всю базу данных для последующего определения плотности слов.Агрегация с Elasticsearch и Java

Данные имеет вид -

PartNumber, ShopName, WordPair, WordPairCount. 

Я не уверен, как писать агрегацию в Java. Я хочу, чтобы конечный результат будет следующий:

Перед (по умолчанию)

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

После Aggregation

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

Данных загружаются с подсчетами, установленных в единицу, а затем я хочу выполните агрегирование, чтобы эффективно суммировать значения по умолчанию по элементу PartNumber, ShopName в качестве ключа. Следовательно, окончательные данные покажут, что 15-сантиметровая пластина широко не продается, но Пластина 30 см широко продается (в обоих магазинах).

В SQL это была бы простая группа с обновлением по соединению. Но 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 
+0

Приведенный выше результат придет, если вы выполните группуByWordPair, так как есть 2 счета для 30 см и 1 для 15 см. Это то, чего вы хотите достичь? – Richa

+0

Я добавил sql, чтобы уточнить мой запрос. –

+0

Вы хотите объединить на WordPair в java ?? – Richa

ответ

0

Вы можете использовать это:

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 в качестве своего счета.

Надеюсь, это поможет.

Смежные вопросы