2016-04-27 31 views
0

私は本のElasticsearchデータベースを持っている:Elasticsearch - ユニークカウントの集計

{ 
    "id": 1, 
    "name": "Animal Farm" 
}, 
{ 
    "id": 2, 
    "name": "Brave New World" 
}, 
{ 
    "id": 3, 
    "name": "Nineteen Eighty-Four" 
}, 
{ 
    "id": 4, 
    "name": "Animal Farm" 
}, 
{ 
    "id": 5, 
    "name": "We" 
} 

あなたが見ることができるように、1id4と本が競合ブック名「動物農場」を持っています。しかし、彼らは別の本です。 1つはGeorge Orwell、もう1つは文字通り農場の動物に関するものです。

本の名前が矛盾する頻度を知りたいと思います。上記の例では、期待される結果は次のとおり

{ 
    "conflicts": [ 
    { 
     "num_of_books": 2, 
     "count": "1" 
    }, 
    { 
     "num_of_books": 1, 
     "count": "3" 
    } 
    ] 
} 

2num_of_booksのエントリは、「動物農場」の衝突であり、(従ってcount1である)一度起こりました。他の3冊の本はすべて異なる名前なので、num_of_books1count3のエントリに表示されます。 I には本の名前が必要です。カウントだけが重要です。

私はSQLがこれを行うには、「サブクエリ」を持って知っている:

SELECT num_of_books, COUNT(*) AS _count 
FROM (
    SELECT COUNT(*) AS num_of_books 
    FROM books 
    GROUP BY name 
) 
GROUP BY num_of_books; 

私はNested AggregationSub-Aggregationsの記事を読んで、私の目標を達成する可能性を見ることができませんでした。

コメントありがとうございます!

答えて

0

集計上の集計の実行は、私が知る限り、ESではまだ実行できません。バケット集計の結果に追加のロジックを適用することを可能にすることに関するいくつかの未解決の問題については知っていますが、まだ議論され議論されています。

min_doc_count: 2を使用して、競合するすべての書籍の名前を取得するために、termsアグリゲーションを使用して内部SQLクエリを取り除くことができます。

{ 
    "size": 0, 
    "aggs": { 
     "books": { 
      "terms": { 
       "field": "name", 
       "min_doc_count": 2 
      } 
     } 
    } 
} 

その後、あなたはそれらの数に応じて、新しいnum_of_booksバケットに、クライアント側のバケットと再バケツにそれらを解析することができます。

{ 
    "2": 1, 
    "1": 3 
} 
+0

は答えてくれてありがとう、しかしデータwouldnの量:たとえば、あなたが変換セクション

var num_of_books = {}; root.aggregations.books.buckets.forEach(function(b) { num_of_books[b.doc_count] = (num_of_books[b.doc_count] || 0) + 1; }); return num_of_books; 

num_of_books、このようなものを含んでいるでしょうに次のコードを追加することができますプラグインのヘッドを使用して私はクライアント側で外部集約を行うことができません。サーバー上ですべての計算を行う方法はありますか?スクリプトフィールドを使うのと同じですか? –

+0

初心者の方には、パフォーマンスがどのような結果を出すのかを試してみましたか?ヘッドプラグインを使用すると、1分以内に動作するかどうかを確認できます。 – Val

+0

はい、私はあなたのソリューションを試しました、そして、それは私の顧客がそれを待つのには時間がかかります。私は計算が10秒未満で完了する必要があります。 –

関連する問題