index作成時にRejecting mapping update to [] as the final mapping would have more than 1 type:

type":"illegal_argument_exception","reason":"Rejecting mapping update to [index_name] as the final mapping would have more than 1 type: [_doc, data]"}]

のエラーでインデックスの作成までは行くのですが、データの登録ができません。
type: [_doc, data]のようにtypeを定めている部分というのは何を参照すればよいのでしょうか?

Elasticsearch 6.0から、typeは1つだけ ということになっています。

https://www.elastic.co/guide/en/elasticsearch/reference/6.7/breaking-changes-6.0.html

以下、提示されているエラーを再現する手順を書いてみます。

# インデックスを作成
PUT forum0924

# 1つめのドキュメントを登録する
POST forum0924/_doc/1
{
    "message": "test1"
}

# 2つめのドキュメントを登録する
POST forum0924/data/2
{
     "message": "test2"
}

このようにすると、ID=2のドキュメントを登録しようとした段階で、_docというタイプが既にある状態なのにdataというタイプを追加しようとしたとして、エラーになります。

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "Rejecting mapping update to [forum0924] as the final mapping would have more than 1 type: [_doc, data]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "Rejecting mapping update to [forum0924] as the final mapping would have more than 1 type: [_doc, data]"
  },
  "status": 400
}

もし、curlでドキュメントを登録しようとされているのならば、{Index名}/{Type名}/{ID} という構成になっているかと思うので、Typeのところを確認いただくと良いです。
上の例では、 _docやdataとなっているところです。

お使いのバージョンがいくつかわかりませんが、タイプについては独自に定義せずに_docとしておくのが良いかと思います。

エラーが起きたときの具体的な手順や環境情報がありませんでしたので、想像の範囲となりますがご参考になれば幸いです。

こんにちは。ご回答いただき、ありがとうございます。
エラーが起きた時の手順ですが、javascriptのプログラムでindexを作成し
request.postメソッドでindex名/data/idという形で登録したいデータを登録していました。
この場合1件目から指定しているtypeは「data」なのでは?と考えていますが、「_doc」が登録されているタイミングがわかりません。

request.post({
url: ${this.esUrl + '/' + indexName}/_doc/${id},
headers: {
'Content-type': 'application/json',
},
auth: {
user: 'elastic',
password: 'hoge',
},
json: data,
})

インデックス作成は、どのように作成されていますか?

例えば、mappingを作成するときに、_docをつけているということはありませんか?
以下のように作っている場合は、1件目 forum0925/data/1 でドキュメントを登録しようとした段階でエラーになります。

PUT forum0925?include_type_name=true
{
  "mappings": {
    "_doc": {
      "properties": {
        "message": { "type": "text" }
      }
    }
  }
}

いずれにしましても、お使いのElasticsearchのバージョン情報、どういう手順、設定でインデックスを作成し、ドキュメントを登録しようとしているのか、テストデータでも良いので共有いただく方が、スムーズに解決できる可能性が高まるかと思います。

詳細情報の提示がなくてすみません。
インデックス作成時は以下のmappingで作成しています。(ESのバージョンはv7.3.2)
json: {
settings: {
analysis: {
analyzer: {
my_kuromoji_analyzer: {
type: 'custom',
tokenizer: 'ja_tokenizer',
},
},
tokenizer: {
ja_tokenizer: {
type: 'kuromoji_tokenizer',
mode: 'normal',
},
},
},
},
mappings: {
properties: {
title: { type: 'text', analyzer: 'my_kuromoji_analyzer' },
prefecture: { type: 'text', analyzer: 'my_kuromoji_analyzer' },
onsen: { type: 'text', analyzer: 'my_kuromoji_analyzer' },
price: { type: 'long' },
reviews: { type: 'text', analyzer: 'my_kuromoji_analyzer' }
}
}

登録しようとしているドキュメント
{ id: '1',
title: 'hogeホテル',
price: '9000',
prefecture: 'ホゲ県',
onsen: 'ホゲ温泉',
reviews: '4_5'}

これらのjsonをnode.jsからrequestモジュールを使用してput,postしております。

情報ありがとうございます。

7系からタイプ"レス"ということで、タイプを指定しなくなっています。
内部では _docを使うことになっているので、提示いただいた例ですとmappingやsettings情報をつけてインデックスを登録した時点で、_docが登録されていると思います。

もし、単純にmappingやsettingsをつけずにインデックスを作成したら、typeをdataにして登録してもエラーにならないはずです。

このようなインデックス作成です。

PUT hoge-index

_docで登録されるタイミングはどこか? という点については上記のような内容になろうかと思っております。

一方、ドキュメント登録については、タイプレスの考え方に準じて、
dataで登録しているところを _docとしてドキュメントを登録して頂くのがよさそうに思います。

1 Like

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