# ウォッチャーにおいて計算結果をフィールドとして追加する方法

**URL:** <https://discuss.elastic.co/t/topic/188003>\
**Category:** 日本語による質問・議論はこちら\
**Tags:** elastic-stack-alerting\
**Created:** [June 28, 2019, 9:25am UTC](https://discuss.elastic.co/t/topic/188003 "2019-06-28T09:25:30Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![5f750bbb360aba6ced5f](https://avatars.discourse-cdn.com/v4/letter/5/f1d935/32.png) [@5f750bbb360aba6ced5f](https://discuss.elastic.co/u/5f750bbb360aba6ced5f)\
**Post date:** [June 28, 2019, 9:25am UTC](https://discuss.elastic.co/t/topic/188003/1 "2019-06-28T09:25:30Z")

</div>

(特定の文字や記号やアルファベットが含まれるとなぜかタイトルがエラーになってしまうため、わかりにくいタイトルになってしまっております。。)

ある条件を満たしたユーザのみを抽出し、ドキュメント内のフィールドから算出した結果をさらにフィールドとして追加して、メール送信を行うというWatcherを作成しようとしています。  
例としては下記の通り、出力時に"打数","安打"から打率を計算し、フィールドに新たに追加して出力する、というイメージです。  
このときの、打率を計算して、新たなフィールドとして追加するScriptがわからず困っております。もしご存知の方いましたら、教えていただきたいです。

```
◆ Watcher Input
PUT my_index/
    {
     "id":1
     "打数":5 
     "安打":1
    }
    PUT my_index/
    {
     "id":2
     "打数":4
     "安打":2
    }

```

◆ Watcher Condition  
～割愛～

```
◆ Watcher Action で出力するインデックスの内容
{
 "id":1
 "打数":5 
 "安打":1 
 "打率":0.2
}
{
 "id":2
 "打数":4
 "安打":2 
 "打率":0.5 
}
```

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [June 29, 2019, 12:52pm UTC](https://discuss.elastic.co/t/topic/188003/2 "2019-06-29T12:52:13Z")

</div>

こんにちわ。

以前Watcherの質問でありました内容に少し付け足せば可能かと思います。

> [@Watcher Index Actionで、ドキュメントを分けて出力する](https://discuss.elastic.co/t/watcher-index-action/181738):
>
> 基礎的な質問で恐縮ですが、WatcherのIndex Actionを利用すると、デフォルトでは、集計結果が、一つのドキュメントにまとめられて出力されます。 これを、Watcherで引っかかったドキュメントが、そのまま別々の状態で出力されるように設定をしたいです。 たとえば、 ①下記のような３つのデータを用意 \*doc1 pc\_name : A feature : B \*doc2 pc\_name : A feature : C \*doc3 pc\_name : B feature : B ②Watcherで、FeatureにBが含まれるときに、Indexを作成するように設定 ③doc1とdoc3が、一つのインデックスに、別々のドキュメントして出力 という流れをつくりたいです 初歩的なミスなのかもしれませんが、、下記の通り、Transform句を使用して作成してみたのですが、「no requests added」というエラーが出てしまいました。 { "trigger": { "schedule": { "inte…

transformでこのようにしております。  
`ctx.payload.hits.hits[i]['打率'] = ` の部分がフィールドを追加しているところになります。  
(蛇足ですが、ゼロ除算、ぬるぽなどは別途考慮ください)

```yml
"actions": {
    "index_payload": {
      "transform": {
        "script": """
        for (int i = 0; i < ctx.payload.hits.hits.length; ++i) {
          ctx.payload.hits.hits[i] = ctx.payload.hits.hits[i]._source;
          ctx.payload.hits.hits[i]['打率'] = (double)ctx.payload.hits.hits[i]['安打'] / (double)ctx.payload.hits.hits[i]['打数'];
        }
        return ['_doc' : ctx.payload.hits.hits];
        """
      },
      "index": {
        "index": "watcher-index"
      }
    }
  }

```

実際に登録されるindexはこのようになりました。

```auto
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "watcher-index",
        "_type" : "_doc",
        "_id" : "XXFIo2sBsZpVTu8PuMgc",
        "_score" : 1.0,
        "_source" : {
          "安打" : 2,
          "打数" : 4,
          "打率" : 0.5
        }
      },
      {
        "_index" : "watcher-index",
        "_type" : "_doc",
        "_id" : "XnFIo2sBsZpVTu8PuMgc",
        "_score" : 1.0,
        "_source" : {
          "安打" : 1,
          "打数" : 5,
          "打率" : 0.2
        }
      }
    ]
  }
}

```

打率が計算されて追加されていることが確認できました。

ご参考になれば幸いです。

動作確認環境： Elasticseardch 7.2.0

---

<div class="post-metadata">

**Author:** ![5f750bbb360aba6ced5f](https://avatars.discourse-cdn.com/v4/letter/5/f1d935/32.png) [@5f750bbb360aba6ced5f](https://discuss.elastic.co/u/5f750bbb360aba6ced5f)\
**Post date:** [July 1, 2019, 4:40am UTC](https://discuss.elastic.co/t/topic/188003/3 "2019-07-01T04:40:47Z")

</div>

[tsgkdt](https://discuss.elastic.co/u/tsgkdt)さん

丁寧でわかりやすいご説明、ありがとうございます。

> ctx.payload.hits.hits[i]['打率'] = (double)ctx.payload.hits.hits[i]['安打'] / (double)ctx.payload.hits.hits[i]['打数'];

こうやってフィールドの値を用いた計算と、新たなフィールド作成ができるのですね、

重ねて恐縮ですが、  
このあたりの細かい文法がわかりやすくまとまったページ等、もしご存知でしたら教えていただきたいです。

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [July 2, 2019, 2:26am UTC](https://discuss.elastic.co/t/topic/188003/4 "2019-07-02T02:26:15Z")

</div>

スクリプトで使用されるpainlessについての情報入手元ですが、公式サイトだと以下が参考になるかと思います。

言語についての説明  
[https://www.elastic.co/guide/en/elasticsearch/painless/master/painless-lang-spec.html](https://www.elastic.co/guide/en/elasticsearch/painless/master/painless-lang-spec.html)

簡単な使用例リスト  
[https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-walkthrough.html](https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-walkthrough.html)

painlessを使いこなせると、フィールドやスコア、reindex、ingestなどいろいろな場面で活躍できそうです。  
Javaに親しみがあれば、さほど苦(pain)がないかと思います。

---

<div class="post-metadata">

**Author:** ![5f750bbb360aba6ced5f](https://avatars.discourse-cdn.com/v4/letter/5/f1d935/32.png) [@5f750bbb360aba6ced5f](https://discuss.elastic.co/u/5f750bbb360aba6ced5f)\
**Post date:** [July 2, 2019, 4:50am UTC](https://discuss.elastic.co/t/topic/188003/5 "2019-07-02T04:50:21Z")

</div>

[tsgkdt](https://discuss.elastic.co/u/tsgkdt)さん

ありがとうございます！やはり一番まとまっているのは公式ドキュメントですよね。

実は公式ドキュメントは拝見したのですが、基礎知識がないために、  
書いてある部分についてはなんとなくわかるものの応用が利かせられない、という側面が自分の場合ありそうです、

Java,Groovyの考え方なども参考にしながら、公式ドキュメントで勉強していこうと思います、  
ご丁寧にありがとうございました！

---

<div class="post-metadata">

**Author:** ![tsgkdt](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/tsgkdt/32/39151_2.png) [@tsgkdt](https://discuss.elastic.co/u/tsgkdt)\
**Post date:** [July 4, 2019, 12:22pm UTC](https://discuss.elastic.co/t/topic/188003/6 "2019-07-04T12:22:48Z")

</div>

同じような悩みを持つ人が思いのほか多いと、話してみて気づくこともあります。

公式トレーニングや、コミュニティの勉強会などで同志が見つかると、独力での勉強もはかどるかと思います。

ということで、よろしければ以下もご検討ください。  
[公式トレーニング](https://training.elastic.co/location/Tokyo-JP)は9月、コミュニティの[勉強会は来週10日](https://www.meetup.com/ja-JP/Tokyo-Elastic-Fantastics/events/262803724/)にあります。

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [August 1, 2019, 12:22pm UTC](https://discuss.elastic.co/t/topic/188003/7 "2019-08-01T12:22:56Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
