elasticsearch2go
は, Elasticsearch のマッピング定義を基に Go の構造体を自動生成するツールです. Elasticsearch の JSON スキーマから Go の構造体を生成し, コードの自動化と一貫性の維持を支援します.
elasticsearch2go-demo.mp4
この project は, 株式会社 MIXI (@mixigroup) の minimo 事業部にジョインしていた時に, 私が MLOps の一つとして自動化のために作ったものです.
事業部のご厚意により, この package を OSS として公開することを快く承諾していただきました! ありがとうございます!
web: https://mixi.co.jp/
このパッケージをインストールするには, 以下のコマンドを使用してください.
go get github.com/taniiicom/elasticsearch2go
このパッケージを使用して, Elasticsearch のマッピング定義から Go の構造体を生成する方法を以下に示します.
e.g.
go run github.com/taniiicom/elasticsearch2go/cmd \
--in example/elasticsearch/cafe-mapping.json \
--out example/infrastructure/datamodel/searchmodel/cafe.gen.go \
--struct CafeDocJson \
--package searchmodel \
package gen
import (
"log"
"github.com/taniiicom/elasticsearch2go" // import the package
)
func main() {
// required arguments
inputPath := "example/elasticsearch/cafe-mapping.json"
outputPath := "example/infrastructure/datamodel/searchmodel/cafe.gen.go"
packageName := "searchmodel"
structName := "CafeDocJson"
// optional arguments
opts := &elasticsearch2go.GeneratorOptions{
InitClassName: nil, // optional
TypeMappingPath: nil, // optional
ExceptionFieldPath: nil, // optional
ExceptionTypePath: nil, // optional
SkipFieldPath: nil, // optional
FieldCommentPath: nil, // optional
TmplPath: nil, // optional
}
// generate datamodel
err := elasticsearch2go.GenerateDatamodel(inputPath, outputPath, packageName, structName, opts)
if err != nil {
log.Fatalf("Failed to generate data model: %v", err)
}
}
このパッケージには, 以下のコマンドラインオプションがあります.
--in
: (必須) 入力の JSON スキーマファイルのパスを指定します.--out
: (必須) 出力先の Go ファイルのパスを指定します.--package
: (必須) 出力される Go ファイルのパッケージ名を指定します.--struct
: (必須) 生成される構造体の名前を指定します.--init
: 初期化用のラッパー構造体の名前を指定します(オプション).--type-mapping
: Elasticsearch の型を Go の型にマッピングする JSON ファイルのパスを指定します(オプション).--exception-field
: field 名の例外を定義する JSON ファイルのパスを指定します(オプション).--exception-type
: 型の例外を定義する JSON ファイルのパスを指定します(オプション).--skip-field
: 生成からスキップする field を定義する JSON ファイルのパスを指定します(オプション).--field-comment
: field にコメントを追加するための JSON ファイルのパスを指定します(オプション).--tmpl
: カスタム Go テンプレートファイルのパスを指定します(オプション).
このパッケージは, 様々なカスタマイズが可能です. 以下に, いくつかのカスタマイズ方法を示します.
Elasticsearch の型を特定の Go 型にマッピングするためには, custom_mapping.json
ファイルを使用します. 例:
{
"text": "*string",
"integer": "int"
}
これにより, text
型が*string
に, integer
型がint
にマッピングされます.
field 名に特定の変換を適用するためには, custom_field_exceptions.json
ファイルを使用します. 例:
{
"my_field": "MyCustomField"
}
これにより, my_field
がMyCustomField
という field 名に変換されます.
特定の field を生成からスキップするためには, skip_fields.json
ファイルを使用します. 例:
{
"unnecessary_field": true
}
これにより, unnecessary_field
が構造体から除外されます.
Elasticsearch で"type": "nested"
として定義された field は, Go の構造体生成時にサブ構造体として扱われます. このサブ構造体は, メインの構造体の下に, 同じ出力ファイル内で生成されます. これにより, ネストされた構造をそのまま Go のコードに反映することができます.
elasticsearch -> go の, { field 名, type } の例外的な対応を JSON ファイルで指定できます. 例外的な対応は, field 名と型の両方に適用できます.
また, 特定の property をスキップするための JSON ファイルを指定できます. これにより, 不要な field を生成から除外できます.
elasticsearch の field にコメントを追加するための JSON ファイルを指定できます. この機能を使用すると, 生成された Go の構造体にコメントを追加できます.
生成するファイルのフォーマットをカスタマイズするために, カスタムテンプレートファイルを指定できます. この機能を使用すると, 出力される Go のコードのフォーマットを制御できます.
現時点では, 生成される構造体の field 順は, アルファベット順です. 今後のバージョンで, field 順序を, オリジナルの Elasticsearch の定義を維持できるようになる予定です.
このパッケージに対する貢献は歓迎されます. 貢献するには, 以下の手順に従ってください.
- このリポジトリを Fork します.
- 新しいブランチを作成します (
git checkout -b feature/your-feature-name
). - 変更をコミットします (
git commit -m 'Add some feature'
). - ブランチにプッシュします (
git push origin feature/your-feature-name
). - GitHub でプルリクエストを作成します.
このプロジェクトは MIT ライセンスの下で公開されています. 詳細は LICENSE
ファイルを参照してください.
このパッケージは現在, @taniiicom (Taniii.com) によってメンテナンスされています. 問題が発生した場合は, GitHub の Issues を使用して報告してください.