# フィールドの配列から特定の要素を削除する方法

**URL:** <https://discuss.elastic.co/t/topic/160055>\
**Category:** 日本語による質問・議論はこちら\
**Created:** [December 9, 2018, 4:19pm UTC](https://discuss.elastic.co/t/topic/160055 "2018-12-09T16:19:51Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![1713](https://avatars.discourse-cdn.com/v4/letter/1/b5e925/32.png) [@1713](https://discuss.elastic.co/u/1713)\
**Post date:** [December 9, 2018, 4:19pm UTC](https://discuss.elastic.co/t/topic/160055/1 "2018-12-09T16:19:51Z")

</div>

こんにちは。  
タイトルにある方法をここしばらく探していまして、どうしても見つからず皆様のお知恵をお貸し頂けないでしょうか。

以下のように、フィールドが配列になっているドキュメントがあります。

```
{
"Description": "Jay Desc 1",
"Entities": [
{
"ID": "1234",
"NAME": "TAROU",
},
{
"ID": "1234_KANJI",
"NAME": "太郎",
},
{
"ID": "1234_RUBY",
"NAME": "たろう",
},
]
}

```

ここから、IDが1234\_RUBYの要素を削除する場合、以下の方法があります。

```
POST /test/type/1/_update
{
  "script": {
    "lang": "painless",
    "inline": "ctx._source.Entities.removeAll(Collections.singleton(params.Entities))",
    "params" : {
        "Entities":{
            "ID": "1234_RUBY",
            "NAME": "たろう",
        }
    }
  }
}

```

ただしこの方法だと、削除したい要素のすべての情報（上記例だとIDとNAME両方）を指定する必要があります。  
ですが、IDに"\_RUBY"が含まれていることだけが分かっていて数字部分が判らない、且つ、NAMEには何が入っているか不明な場合、どのようにして削除することができるでしょうか。ID=".＊\_RUBY",NAME=".＊"とかやってみたのですがうまくいきませんでした。

何卒宜しくお願い致します。

---

<div class="post-metadata">

**Author:** ![mnozawa](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mnozawa/32/15091_2.png) [@mnozawa](https://discuss.elastic.co/u/mnozawa)\
**Post date:** [December 12, 2018, 4:26am UTC](https://discuss.elastic.co/t/topic/160055/2 "2018-12-12T04:26:14Z")

</div>

これでいかがでしょうか。  
手元の環境ではうまくいきました。  
正規表現でマッチングするのであればまた変わってきそうですね。

```
POST /test/type/1/_update
{
  "script": {
    "lang": "painless",
    "source": "ctx._source.Entities.removeIf(item -> item.ID.contains(params.pattern));",
    "params" : {
        "pattern": "RUBY"
    }
  }
}
```

---

<div class="post-metadata">

**Author:** ![1713](https://avatars.discourse-cdn.com/v4/letter/1/b5e925/32.png) [@1713](https://discuss.elastic.co/u/1713)\
**Post date:** [December 12, 2018, 4:42pm UTC](https://discuss.elastic.co/t/topic/160055/3 "2018-12-12T16:42:17Z")

</div>

mnozawa様

ありがとうございます！完璧に動作しました。  
マッチする要素が複数あっても、forで回す必要なくすべてきれいに削除できますね！  
さっそく全ドキュメントで実行したところ、こちらも大成功です。

```
POST /test/type/_update_by_query
{
  "query": {
    "match_all": { }
  },
  "script": {
    "lang": "painless",
    "source": "ctx._source.Entities.removeIf(item -> item.ID.contains(params.pattern));",
    "params" : {
        "pattern": "RUBY"
    }
  }
}

```

#ElasticsearchのリファレンスよりJAVAの勉強が必要なのだろうか…とちょっと思っちゃいました

---

<div class="post-metadata">

**Author:** ![1713](https://avatars.discourse-cdn.com/v4/letter/1/b5e925/32.png) [@1713](https://discuss.elastic.co/u/1713)\
**Post date:** [December 22, 2018, 5:29am UTC](https://discuss.elastic.co/t/topic/160055/4 "2018-12-22T05:29:11Z")

</div>

度々申し訳ありません。  
上記の続きですが、どうしてもうまくいかなくなってしまいまして、また教えていただけませんでしょうか。

前述のインデックスに以下のデータを入れたのですが、text型でマッピングしている  
フォールドに「数値」として保存されてしまい、containsメソッドが失敗してしまいました。

```
{
"Description": "Jay Desc 1",
"Entities": [
    {
    "ID": 5678, ← ダブルクォーテーションをつけないと数値として保存される
    "NAME": "TAROU"
    },
    {
    "ID": "5678_KANJI",
    "NAME": "太郎"
    },
    {
    "ID": "5678_RUBY",
    "NAME": "たろう"
    }
]
}

```

いろいろ試していて、値をインクリメントできたことから数値である  
こと気がついたのですが、なぜマッピング定義に反した型で保存できて  
しまうのでしょうか。

また、このような場合、保存されている型を判定してエラーを回避するには  
どのようにすれば良いでしょうか。

よろしくお願いいたします。

---

<div class="post-metadata">

**Author:** ![1713](https://avatars.discourse-cdn.com/v4/letter/1/b5e925/32.png) [@1713](https://discuss.elastic.co/u/1713)\
**Post date:** [December 23, 2018, 11:11am UTC](https://discuss.elastic.co/t/topic/160055/5 "2018-12-23T11:11:32Z")

</div>

すみません。自己解決しましたので一応ご報告として書いておきます。  
以下のようにすることで、IDフィールドに整数が入っていてもエラーなく  
実行できるようになりました。

```
POST /test/type/_update_by_query
{
  "query": {
    "match_all": { }
  },
  "script": {
    "lang": "painless",
    "source": "ctx._source.Entities.removeIf(item -> item.ID.toString().contains(params.pattern));",
    "params" : {
        "pattern": "RUBY"
    }
  }
}

```

text型に整数値が保存されている理由ですが、色々試した結果、「保存はtext型で入っているけど、  
スクリプトで演算しようとすると、整数型とみなされる」ということなんじゃないかと思っています。

そこで演算時にStringにキャストすれば行けるのかと思い、上記の方法を思いつきました。  
これが最適な方法かは全くわかりませんが…

---

<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:** [January 20, 2019, 11:11am UTC](https://discuss.elastic.co/t/topic/160055/6 "2019-01-20T11:11:37Z")

</div>

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