# 1Fieldに複数datatypeが存在する場合の対処

**URL:** https://discuss.elastic.co/t/1field-datatype/200627
**Category:** 日本語による質問・議論はこちら
**Created:** [September 23, 2019, 6:29am UTC](https://discuss.elastic.co/t/1field-datatype/200627 "2019-09-23T06:29:53Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![mukai](https://avatars.discourse-cdn.com/v4/letter/m/f08c70/32.png) [@mukai](https://discuss.elastic.co/u/mukai)
#### Post date: [September 23, 2019, 6:29am UTC](https://discuss.elastic.co/t/1field-datatype/200627/1 "2019-09-23T06:29:54Z")

</div>

こんにちは、現在下記の1フィールドに入っている、数値型と文字列型を含むデータを取り込もうとしています。  
 ![image](https://us1.discourse-cdn.com/elastic/original/3X/7/a/7aa88b803b53ff15681f82eb3842d45323d41de9.png)  
 ![image](https://us1.discourse-cdn.com/elastic/original/3X/4/5/45a056f8f7d8a0e023e836554fbbac0728954d1a.png)  
・データの例  
[数値型] 99.338053  
[文字列型] jenkins-test

データ型を数値型に指定すると、下記のエラーが発生します。

> [2019-09-23T14:23:53,594][WARN][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=\>400, :action=\>["index", {:\_id=\>nil, :\_index=\>"zabbix-history02-2019.09", :\_type=\>"\_doc", :routing=\>nil}, #LogStash::Event:0x5acf45aa], :response=\>{"index"=\>{"\_index"=\>"zabbix-history02-2019.09", "\_type"=\>"\_doc", "\_id"=\>"3FCTXG0BzLVwUw45gDUb", "status"=\>400, "error"=\>{"type"=\>"mapper\_parsing\_exception", "reason"=\>"failed to parse field [value] of type [float] in document with id '3FCTXG0BzLVwUw45gDUb'. Preview of field's value: 'HotSpot 64-Bit Tiered Compilers'", "caused\_by"=\>{"type"=\>"number\_format\_exception", "reason"=\>"For input string: "HotSpot 64-Bit Tiered Compilers""}}}}}

また、データ型を文字列型に指定すると、数値データを集計(avg等)することが出来ません。

この問題を解決するためのヒント等をご存じの方がいましたら、アドバイス頂けないでしょうか。  
(例)  
・Index templateの設定方法  
・Logstash側でデータ型を判断して、1フィールドを複数フィールドに分ける等。

よろしくお願いします。

---

<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: [September 23, 2019, 12:48pm UTC](https://discuss.elastic.co/t/1field-datatype/200627/2 "2019-09-23T12:48:06Z")

</div>

こんにちわ

１つのフィールドには１つの意味を持つデータを入れる方が良いと考えております。  
そのため、集計したい数値が入る項目と、文字列で入るjenkins-testと入るような項目は、意味が違う、用途も違うものになるかと思いますので、それぞれ別のフィールドとして定義しまうのが良いのではないかと思います。

Logstashで思いつく対応を書いてみます。

## 数値・文字列の中身の区別が他フィールドで判断できるとき

たとえば、既にhoge\_fieldが数値型フィールドであり、文字列が入ったsome\_fieldを持つデータソースのときは、リネームして混在を避けることができるかと思います。

Mutateのrenameを参照してください。  
[https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html](https://www.elastic.co/guide/en/logstash/current/plugins-filters-mutate.html)

```auto
if [some_field] == "何か判定できる値" {
    mutate {
       # hoge_fieldをhoge_text_fieldに変名し、数値型フィールドと混在しないようにする
        rename => ["hoge_field", "hoge_text_field"]
    }
}

```

フィールド名を変名することで、同じフィールド名で定義が異なるようなデータが存在しなくなります。

## 他に識別するフィールドがなさそうなとき

入っている値に応じて、他のフィールドに値を書く、ということをrubyで書くことで対応できるかと思います。

例）数値だったら、hoge\_field\_numberにセット、文字列だったら、hoge\_text\_fieldにセットする

[https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html](https://www.elastic.co/guide/en/logstash/current/plugins-filters-ruby.html)

こちらの方が「Logstash側でデータ型を判断して、1フィールドを複数フィールドに分ける等」で求めている内容に近いかもしれません。

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

---

<div class="post-metadata">

### Author: ![mukai](https://avatars.discourse-cdn.com/v4/letter/m/f08c70/32.png) [@mukai](https://discuss.elastic.co/u/mukai)
#### Post date: [September 24, 2019, 1:33am UTC](https://discuss.elastic.co/t/1field-datatype/200627/3 "2019-09-24T01:33:51Z")

</div>

対応方法を教えて頂き、ありがとうございます。

> **[Accessing event data and fields | Logstash Reference \[8.11\] | Elastic](https://www.elastic.co/guide/en/logstash/current/event-dependent-configuration.html)**

> regexp: `=~` , `!~` (checks a pattern on the right against a string value on the left)

アドバイス頂いたif文と上記の正規表現判定を使って下記のように書く事で、概ね「1フィールド内の数値と文字を、複数フィールドに分割」することが出来ました。

> 数値以外(文字列)の場合、フィールド名を変更(value→textvalue)  
> if [value] !~ /\[1\]+$/ {  
> mutate{  
> rename =\> { "value" =\> "textvalue" }  
> }  
> }

とても参考になりました。アドバイスありがとうございます。

* * *

1. 0-9.

---

<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: [October 22, 2019, 1:33am UTC](https://discuss.elastic.co/t/1field-datatype/200627/4 "2019-10-22T01:33:54Z")

</div>

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