web-dev-qa-db-ja.com

elasticsearch:フィールドから数値を抽出します

ログの保存にelasticsearchとkibanaを使用しています。ここで必要なのは、フィールドから数値を抽出して、新しいフィールドに格納することです。

したがって、たとえば、これを持っている:

accountExist実行時間:1046ミリ秒

番号(1046)を抽出して、キバナの新しいフィールドで確認したいと思います。

出来ますか?どうやって?助けてくれてありがとう

13
Pirulino

インデックス作成前/インデックス作成中にこれを行う必要があります。

Elasticsearch内で、インデックス作成中に必要なものを取得できます。

  1. パターンアナライザー を使用して新しいアナライザーを定義し、正規表現をラップします(目的のために、文字列内の連続する数字をキャプチャします--- このトピックに関する良い答え )。
  2. 抽出された時間を保持するために、マッピングに新しい数値フィールドを作成します。
  3. copy_to を使用して、ログメッセージを入力フィールドから(2)の新しい数値フィールドにコピーし、そこで新しいアナライザーがメッセージを解析します。

Analyze API は、テストの目的に役立ちます。

5

パフォーマンスは劣りますが、インデックスの再作成をしなければならない場合は、kibanaでスクリプトフィールドを使用できます。

ここでの紹介: https://www.elastic.co/blog/using-painless-kibana-scripted-fields

  • elasticsearch.yamlに次の情報を入力して、痛みのない正規表現のサポートを有効にします。

    script.painless.regex.enabled:true

  • elasticsearchを再起動します
  • [管理]-> [インデックスパターン]-> [スクリプトフィールド]を使用して、Kibanaに新しいスクリプトフィールドを作成します
  • 言語として無痛を選択し、タイプとして数を選択します
  • たとえば、実際のスクリプトを作成します。
 def logMsg = params ['_ source'] ['log_message']; 
 if(logMsg == null){
 return -10000; 
} 
 def m = /。* accountExist実行時間:([0-9] +)ms。* $ /。matcher(params ['_ source'] ['log_message']); 
 if(m .matches()){
 return Integer.parseInt(m.group(1))
} else {
 return -10000 
} 
  • 新しいフィールドを実行するには、Webサイトを完全にリロードする必要があります。開いている検出サイトで検索をやり直すだけでは、新しいフィールドは取得されません。 (これはほとんど私がこれを機能させることを試みるのをやめさせました-.-)
  • 発見または視覚化でスクリプトを使用する

何百万ものログエントリのフィールドをスクリプト化するのはパフォーマンスが悪いことは理解していますが、私のユースケースは非常に特殊なログエントリであり、1日に合計10回ログに記録され、結果のフィールドのみを使用して視覚化を作成します。事前に定期的なクエリで候補者を減らす分析。

これらのフィールドを必要な状況でのみ計算できる場合(または、最初から意味があり、計算可能である場合、つまり「return-1000」を不要にする場合)は興味深いでしょう。現在、それらは適用され、すべてのログエントリに表示されます。
次のようなクエリ内でスクリプトフィールドを生成できます: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html しかし、それは簡単に維持するには、ボンネットの下に埋もれすぎているようです:/

1
icyerasor