2016-08-31 26 views
0

は私が持っているものです:私は「Elasticsearch用のJava API」と同じ結果を得ることはありません。ここで「Kibana」

私はドキュメントの数千人を格納elasticseachにインデックスを持っています。各ドキュメントには「deviceName」というフィールドがあります。

は私が私のインデックスとその出現(デバイスがこのインデックスに表示される時間の数)に保存されているすべてのデバイスを取得したい:ここ

は、私はJavaのAPIをどうしたいものです。私はKibanaで検索方法

String[] indexVector = new String[1]; 
    indexVector[0] = "myIndex"; 
    String [] values = new String[2]; 
    values[0] = "sum_delta"; 
    values[1] = "count_frames"; 
    String [] totalPercentage = new String[1]; 
    totalPercentage[0] = "devices>per_percentage"; 
    SearchResponse response = (SearchResponse) client.prepareSearch(indexVector) 
      .setSize(10000) 
      .addAggregation(AggregationBuilders.terms("devices").field("deviceName") 
        .size(100) 
        .subAggregation(AggregationBuilders.sum("sum_delta").field("delta")) 
        .subAggregation(AggregationBuilders.count("count_frames").field("cnt")) 
        .subAggregation(PipelineAggregatorBuilders.bucketScript("per_percentage") 
          .setBucketsPaths(values) 
          .script(new Script("_value0/(_value0 + _value1 + 1)"))     
          ) 
        ) 
      .addAggregation(PipelineAggregatorBuilders.avgBucket("avg_per_all_devices") 
        .setBucketsPaths(totalPercentage) 
        )   
      .execute() 
      .actionGet(); 

enter image description here

ここに私の結果は次のとおりです。

のJava APIを使用すると、私は63を得る。ここ

は私のJavaコードがありますデバイスとkibana 64デバイスとの接続を可能にします。しかし、私の最大の問題は発生です。確かに、30未満の出現を持つデバイスの場合、私はJava APIとKibanaで同じ結果を得ています。しかし、出現が大きい場合、キバナはJava APIによって返されるものより大きい出現を返します。例:kibanaは1010を返すと同時にjava apiは880を返します。

なぜ私は本当に大きな違いがあるのか​​分かりません。

質問:

そう、あなたは私のコードで何が間違っていると私がしなければならないものを私に伝えることができますしてください?

ご協力いただきありがとうございます。

+1

正確なコピー/貼り付けコードですか、それとも入力したのですか?それはコンパイルされないためです。正確なJavaコードをコピー/貼り付けてください。木場が送ったリクエストも表示できますか? – Val

+0

私は私の質問に関連しないと思った部分を私のコードで削除しました。私は木場で自分の研究をどのようにしているかを示すために写真を追加しました。 –

答えて

0

これは、おそらくsetSizeパラメータのためです。 set sizeパラメータは最初に10000のドキュメントを取得し、その上で集計を実行しますが、あなたはキバナでこのようなサイズを設定しているとは思わないのです。 get sizeを実際のドキュメント数に設定し、あいまいさが存続するかどうかを確認してください。

0

私は_value0 + _value1 + 1が0と等しいいくつかの文書をサポートしています。response.toString()を印刷することができます.1つの断片が失敗したと思います.880文書は、の1010文書に閉じられています。 elasticseachのログを表示することもできます。ERRORが印刷されます。

+0

_value0 = sum_deltaおよび_value1 = count_frames。両方とも正であるため、_value0 + _value1 + 1は常に0よりも厳密に大きくなります。 –

関連する問題