# Elasticsearch内のデータの結合について

**URL:** <https://discuss.elastic.co/t/elasticsearch/175429>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [April 4, 2019, 1:46pm UTC](https://discuss.elastic.co/t/elasticsearch/175429 "2019-04-04T13:46:56Z")\
**Posts on this page:** 1\
**Showing post:** 2

<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:** [April 4, 2019, 5:05pm UTC](https://discuss.elastic.co/t/elasticsearch/175429/2 "2019-04-04T17:05:13Z")

</div>

こんにちわ。

コマンドIDをキーとして、ログAとログBが1対1で紐づいている、ということでしょうか。  
ということであれば、Logstashの中でOutputのフィルタリングにelasticsearchを指定しているかと思いますが、  
ここで、 doc\_as\_upsertという設定ができるので、これをtrueにしてみてください。  
[https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-doc\_as\_upsert](https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html#plugins-outputs-elasticsearch-doc_as_upsert)

こうすることで、IDをキーに１つのドキュメントに対して、それぞれAとBのログをいれると、「コマンドID、コマンド名、コマンド応答」のようなドキュメントとなります。  
AのあとにBが入っても、先にBがあって後からAでも、IDさえあればマージされたように見えるはずです。

以下こちらで試したところを貼っておきます。

## テストデータ

２つのCSVを用意する。それぞれ、a.csv, b.csvとする。

- a.csv

```auto
ID,NAME
1,コマンド名Ａ
2,コマンド名Ｂ
3,コマンドー

```

- b.csv

```auto
ID,VALUE
1,成功
2,失敗
3,成功

```

## Logstashの設定

ポイントはOutputのところでUpsertを指定してところです。  
document\_idがなければinsert、あればupdateとなります。  
既存の項目値はそのまま上書されてしまいますが、今回のようにNAMEとVALUEとかぶらないフィールドであればマージされたような状態となり期待した結果となるように思います。

```auto
input {
  file {
      path => "/tmp/a.csv"
      start_position => "beginning"
      tags => ["type_a"]
  }

  file {
      path => "/tmp/b.csv"
      start_position => "beginning"
      tags => ["type_b"]
  }
}

filter {

   if "type_a" in [tags] {

       csv {
            columns => ["id","name"]
            separator => ","
            skip_header => true
       }
   } else {

       csv {
            columns => ["id","value"]
            separator => ","
            skip_header => true
       }
   }

   
}

output {
    elasticsearch {
        hosts => ["elasticsearch:9200"]
        index => "forum0404"
        document_id => "%{id}"
        doc_as_upsert => true
        action => "update"
    }
}

```

## 結果

```json
{
        "_index" : "forum0404",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "@version" : "1",
          "tags" : [
            "type_b"
          ],
          "@timestamp" : "2019-04-04T16:48:41.302Z",
          "host" : "bd72215c114b",
          "id" : "3",
          "name" : "コマンドー",
          "message" : "3,成功\r",
          "path" : "/tmp/b.csv",
          "value" : "成功"
        }
      }

```

## 確認した環境

- Elasticserch: 7.0.0-rc2 (on Docker)
- Logstash: 7.0.0-rc2 (on Docker)
- Kibana: 7.0.0-rc2 (on Docker)

## 参考情報

- [Upsert with logstash](https://discuss.elastic.co/t/upsert-with-logstash/59116)

---

_[View the full topic](https://discuss.elastic.co/t/elasticsearch/175429)._
