web-dev-qa-db-ja.com

Elasticsearchでマッピングを更新してフィールドのデータ型を変更し、文字列内のアナライザーのタイプを変更する方法

マッピングを更新しようとすると、次のエラーが発生します。

{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"mapper [timestamp] of different type, current_type [string], merged_type [date]"}],"type":"illegal_argument_exception","reason":"
mapper [timestamp] of different type, current_type [string], merged_type [date]"},"status":400}

Windowsで次のコマンドを実行しようとしています

   curl -XPUT localhost:9200/logstash-*/_mapping/log?update_all_types -d "{
    "properties":
    {
        "timestamp": 
        {
            "type": "date", 
            "format": "MM-dd-yyyy HH:mm:ss",
            "fielddata":{"loading" : "lazy"} }
        }
    }";

日付フィールドのデータ型を特定の形式で文字列から日付型に変更する方法を教えてください。

文字列データ型のマッピングを変更してeagerローディングとnot_analyzedに分析から変更しようとしましたが、次のエラーが発生しました:

{"root_cause":[{"type":"illegal_argument_exception","reason":"Mapper for [AppName] conflicts with existing mapping in other types:\n[mapper [AppName] has different [index] values, mapper [App
 different [doc_values] values, cannot change from disabled to enabled, mapper [AppName] has different [analyzer]]"}],"type":"illegal_argument_exception","reason":"Mapper for [AppName] conflict with
existing mapping in other types:\n[mapper [AppName] has different [index] values, mapper [AppName] has different [doc_values] values, cannot change from disabled to enabled, mapper [AppName]
rent [analyzer]]"},"status":400}

これは私の同じクエリです:

 curl -XPUT localhost:9200/logstash-*/_mapping/log?update_all_types -d "{
"properties":
    {"AppName":
        {
        "type": "string", 
        "index" : "not_analyzed",
        "fielddata":{"loading" : "eager"}
        }
    }
}"

ただし、not_analyzedからanalyzedに変更すると、acknowledged=trueメッセージが表示されます。アナライザーを変更するにはどうすればよいですか。

12

既存のデータ型マッピングを変更することはできません。 Elastic docsが言うように:

既存のマッピングに追加できますが、既存のフィールドマッピングを変更することはできません。フィールドのマッピングが既に存在する場合は、そのフィールドのデータにインデックスが付けられている可能性があります。フィールドマッピングを変更すると、インデックス付きデータが正しくなくなり、適切に検索できなくなります。

マッピングを更新して新しいフィールドを追加できますが、既存のフィールドをanalyzedからnot_analyzedに変更することはできません。

唯一の選択肢は、新しいマッピングで新しいインデックスを作成し、古いインデックスから新しいインデックスにデータのインデックスを再作成することです。

14
israelst

いいえ、単一のフィールド定義を変更することはできません。

1つのタイプの1つのフィールドのフィールド定義を変更する場合、インデックス内のすべてのドキュメントのインデックスを再作成する以外に選択肢はほとんどありません。


なぜマッピングを変更できないのですか?この記事 ゼロダウンタイムでマッピングを変更する は、

データを検索可能にするために、データベースは、各フィールドに含まれるデータのタイプと、それをどのようにインデックス付けするかを知る必要があります。

たとえば、フィールドタイプを文字列を日付に変換すると、すでにインデックス付けしたそのフィールドのすべてのデータが役に立たなくなります。何らかの方法で、そのフィールドのインデックスを再作成する必要があります。

これはElasticsearchだけでなく、検索にインデックスを使用するすべてのデータベースに適用されます。インデックスを使用していない場合は、柔軟性のために速度を犠牲にしています。


フィールドタイプが正しくないドキュメントにインデックスを作成するとどうなりますか?

変換が試行されます。有効な変換が存在しない場合は、例外がスローされます。

Elasticsearch:The Definitive Guide には例に関するメモがあり、stringが入力されていますが、longが必要です。変換が試行されます。ただし、有効な変換が存在しない場合でも例外はスローされます。

[...]フィールドがすでにlong型としてマッピングされている場合、ESは文字列をlongに変換しようとし、変換できない場合は例外をスローします。


不正なフィールドを無視して、ドキュメントにインデックスを付けてもよいですか?

はい。 ES5はignore_malformed mappingパラメータ。 Elasticsearchリファレンス は、

間違ったデータ型をフィールドにインデックス付けしようとすると、デフォルトで例外がスローされ、ドキュメント全体が拒否されます。 ignore_malformedパラメータをtrueに設定すると、例外を無視できます。 不正なフィールドにはインデックスが作成されませんが、ドキュメント内の他のフィールドは正常に処理されます。

2
sam