2017-09-27 16 views
0

2つのクエリのカウントで除算を表示するためのルーセン式を作成しようとしています。どちらのクエリもテキスト情報を含み、両方の結果はメッセージフィールドにあります。私はこれを正しく書く方法がわかりません。これまでのところ、私が行ったことは運なしである -キバナの2つの異なるクエリのカウントを分割する

doc['message'].value/doc['message'].value 

最初のクエリmessageのためのようなテキストが含まれている - 2番目のクエリmessageため"404 not found"

としてテキストが含まれている - 私は何をしたいのか"500 error"

ですcount(404 not found)/count(500 error)

私は助けていただきありがとうございます。

+0

を表現私は私がちょうど確か私が尋ねる正しく理解したい、あなたを助けることができると思います:正確に「404が見つかりません」を含む別個の文書の数を、正確に「500エラー」を浮動小数点として含む別個の文書の数で割ったものを計算したいでしょうか? 「はい」とすると、メッセージフィールドは「キーワード」タイプとしてマップされていますか?いいえの場合は、必要な出力をもう少し明確にする必要があります。 – Miek

+0

@MikeMichaelsはい、メッセージフィールドが "キーワード"タイプとしてマップされていることを確認してください。 – jonny

答えて

1

私はちょうど2つの別々のカウントを実行し、次のようにクライアント側の計算を実行するために非常にきれいになる免責条項を追加するつもりです:

使用することを除いて(のようなものを返します
GET /INDEX/_search 
{ 
    "size": 0, 
    "aggs": { 
    "types": { 
     "terms": { 
     "field": "type", 
     "size": 10 
     } 
    } 
    } 
} 

私の例のタイプではなくあなたの別個のキー):

"aggregations": { 
    "types": { 
     "doc_count_error_upper_bound": 0, 
     "sum_other_doc_count": 0, 
     "buckets": [ 
     { 
      "key": "Article", 
      "doc_count": 881 
     }, 
     { 
      "key": "Page", 
      "doc_count": 301 
     } 
     ] 
    } 

これを使用して、別のカウントを取って平均を計算します。上記に述べたがされた状態で

、ここで私が(単一の要求を経由して)から一緒に置くことができましたハック方法this

GET /INDEX/_search 
{ 
    "size": 0, 
    "aggs": { 
    "parent_agg": { 
     "terms": { 
     "script": "'This approach is a weird hack'" 
     }, 
     "aggs": { 
     "four_oh_fours": { 
      "filter": { 
      "term": { 
       "message": "404 not found" 
      } 
      }, 
      "aggs": { 
      "count": { 
       "value_count": { 
       "field": "_index" 
       } 
      } 
      } 
     }, 
     "five_hundreds": { 
      "filter": { 
      "term": { 
       "message": "500 error" 
      } 
      }, 
      "aggs": { 
      "count": { 
       "value_count": { 
       "field": "_index" 
       } 
      } 
      } 
     }, 
     "404s_over_500s": { 
      "bucket_script": { 
      "buckets_path": { 
       "four_oh_fours": "four_oh_fours.count", 
       "five_hundreds": "five_hundreds.count" 
      }, 
      "script": "return params.four_oh_fours/(params.five_hundreds == 0 ? 1: params.five_hundreds)" 
      } 
     } 
     } 
    } 
    } 
} 

これは、スクリプト内の計算に基づく集計値を返す必要があります。

誰かがこの2つの方法以外のアプローチを提供できる場合、私はそれを見たいと思うでしょう。お役に立てれば。

編集 - 同じスクリプトが無痛ではなく "表現"タイプで行われます(デフォルト)。ただ、次のように上記のスクリプトの値を置き換えます

 "script": { 
      "inline": "four_oh_fours/(five_hundreds == 0 ? 1 : five_hundreds)", 
      "lang": "expression" 
     } 

Luceneを経由して同じことを達成するためにここにスクリプトを更新しましたが

+0

あなたの提案をありがとうございますが、これがlucene式を使用して達成できるかどうかを知りたいですか?私はスクリプティングとこれを行う他の簡単な方法があれば期待して非常に新しいです。 – jonny

+0

。ちょうど不思議なことに、ルーケンの表現と痛みのないスクリプト(私の例のように)として書かれた特別な理由はありますか? – Miek

+0

私たちは、誰かが所有しているクラスタ上で作業しており、無痛のスクリプトを有効にしたくありません。それ以外にも、ルシーンの表現は私にとっては簡単なようです。 – jonny

関連する問題