You are currently viewing OpenSearch フィールドのプロパティを変更する

OpenSearch フィールドのプロパティを変更する

OpenSearchでSQLタイプのクエリを試したところ、日付型フォーマットが適合していないというエラーが表示され、結果を取得することが出来ませんでした。
今回は、一度作成したフィールドのプロパティを変更する方法をメモしておきたいと思います。

最初に結論

日付型フィールドのformatを変更したところ、以下のエラーで変更できませんでした。
結果、一旦インデックスを削除し、正しいインデックスで再度作成しました。

プロパティ変更を実施したときに発生したエラーはこちら

{
  "error" : {
    "root_cause" : [
      {
        "type" : "illegal_argument_exception",
        "reason" : "Mapper for [exec_date] conflicts with existing mapper:\n\tCannot update parameter [format] from [strict_date_optional_time||epoch_millis] to [yyyyMMdd]"
      }
    ],
    "type" : "illegal_argument_exception",
    "reason" : "Mapper for [exec_date] conflicts with existing mapper:\n\tCannot update parameter [format] from [strict_date_optional_time||epoch_millis] to [yyyyMMdd]"
  },
  "status" : 400
}

どうやら、既存のフィールドのプロパティを変更することは出来ない!?
https://linuxhint.com/change-field-type-elasticsearch/

多くの場合、一度作成したインデックスのフィールドタイプは変更できないとのことで、更新する場合はインデックスの再作成が必要とのこと。
初期のインデックス設計が重要になってきそうです。

ここからは実験したときのメモになります

エラーについて

OpenSearchでSQLを利用する方法は以下に記載されています。
https://opensearch.org/docs/latest/search-plugins/sql/sql/index/

OpenSearchダッシュボードから実行すると、以下のエラーになりました。

{
  "error": {
    "type": "IllegalStateException",
    "reason": "There was internal problem at backend",
    "details": "Construct ExprTimestampValue from \"20221221\" failed, unsupported date format."
  },
  "status": 503
}

現在作成した日付データの格納フィールドは「yyyyMMdd」形式で日付を入れていたため、その形式がデフォルトでサポートされていないみたいですね

yyyyMMdd形式でフォーマットを指定する

OpenSearchの日付型フィールドにはフォーマットを指定することが出来ます
https://opensearch.org/docs/2.4/opensearch/supported-field-types/date/

インデックスを定義するときに同時に定義するのが一番良いのですが、今回はそういうことができるということを知らなかったため、あとから変更します。

利用するRestAPIは以下で、OpenSearchのダッシュボードから実行します。

PUT /rakuten_products/_mapping
{
    "properties": {
        "exec_date": {
            "type": "date",
            "format": "yyyyMMdd"
        }
    }
}

実行前のフィールドはこうなっていました

RestAPIでプロパティ変更を試みたところ、エラーで変更できませんでした。

個人的なサイトということもあり、今回は一旦インデックスを削除して作り直しました。
本番環境でのフィールドタイプの変更はなかなか難易度の高い作業になりそうですね。

コメントを残す