この記事にはAIによる文章が一部含まれています。
概要
CKANに触れる機会があったので、備忘録的に。今回は主にDockerで起動できるCKANをベースにお話をしていきます。
CKANとは何か
CKAN(Comprehensive Knowledge Archive Network)は、データセットの保存、管理、公開を行うためのオープンソースのデータ管理システムです。政府機関、NGO、企業などがオープンデータポータルを構築するために広く使用されており、世界中で数千のサイトがCKANを活用しています。
国内では、各都道府県がCKANを用いて情報公開を行っているようです。
CKANの主な特徴:
- データカタログ機能: データセットのメタデータ管理と検索
- データストア: CSV、JSON、XMLなどの構造化データの格納と API 提供
- 拡張性: プラグインシステムによるカスタマイズ
- REST API: 全機能をAPIから利用可能
- 多言語対応: 50以上の言語をサポート
- 権限管理: ユーザー、組織、グループベースのアクセス制御
CKANのベースフレームワーク
Flask
CKANは現在 Flask をベースフレームワークとして使用しています。以前は Pylons フレームワークを使用していましたが、メンテナンス性と現代的な開発手法への対応のため Flask に移行されました。
アーキテクチャ
CKANのアーキテクチャは以下のような構成になっています:
- MVCパターン: Model-View-Controller設計
- PostgreSQL: メタデータの保存
- Apache Solr: 全文検索エンジン(設定に注意が必要)
- Redis: セッション管理とキャッシュ
- uWSGI: アプリケーションサーバー
Solrについて
CKANにおけるSolrは、大まかにいうとカタログの検索に使われます。DBから直接検索することはせず、カタログを登録した段階で、その情報を
Solrに送信して一部の情報のみ保持します。保持する情報は、Solr側で定義しないとだめなので、そっちの知識がある程度必要です。
設定次第ですが、CKAN Defaultだと、単語ごとにくぎって情報を保持します。例えば、"sample catalog"というカタログがあったときに、"sample"と"catalog"で情報が保持されて、それが検索に使われます。このカタログを検索したい場合は、単語全体を検索語として含める必要があり、"samp"や、"cata"だけでは、検索にヒットしないはずです。
このように文章を文字に区切って情報をトークン化するため、日本語の対応がちょっと難しいです。選択肢としては、Solrによるトークン化を、N-gramで保持するようにするか、形態素解析を行うようにするかです。このあたりの方法は説明しません。Solr 形態素解析、とかで調べてみてください。
最新バージョン情報(2025/08/03現在)
CKAN 2.11 (開発版)
現在の最新開発版は CKAN 2.11 です。
CKAN 2.10 (安定版)
現在の安定版は CKAN 2.10.8 です。
Docker版
CKANは公式のDockerイメージとDocker Composeファイルを提供しており、簡単にセットアップできます。
ckan-docker
CKANのCLIコマンド一覧
CKANは豊富なコマンドラインインターフェースを提供しています。
主要コマンド
データベース管理
ckan db init # データベース初期化
ckan db clean # データベースクリーニング
ckan db upgrade # データベースアップグレード
ckan db version # スキーマバージョン確認
ユーザー管理
ckan user add <username> # ユーザー作成
ckan user list # ユーザー一覧
ckan user show <username> # ユーザー詳細
ckan user setpass <username> # パスワード設定
ckan user token add <username> <token_name> # ユーザートークン追加
システム管理者
ckan sysadmin add <username> # システム管理者権限付与
ckan sysadmin list # システム管理者一覧
ckan sysadmin remove <username> # システム管理者権限削除
データセット管理
ckan dataset list # データセット一覧
ckan dataset show <id> # データセット詳細
ckan dataset delete <id> # データセット削除
ckan dataset purge <id> # データセット完全削除
検索インデックス
ckan search-index rebuild # 検索インデックス再構築
ckan search-index clear # 検索インデックスクリア
ckan search-index check # インデックス状態確認
CKAN API リスト
CKANは強力なREST APIを提供しており、すべての機能をプログラムから利用できます。
なお、権限が必要な操作を伴うAPIは、ヘッダーにAPI Tokenをつける必要があります。
基本的なAPIの使用方法
# GET リクエスト(データ取得)
curl "http://demo.ckan.org/api/3/action/package_list"
# POST リクエスト(データ作成・更新)
curl -X POST "http://demo.ckan.org/api/3/action/package_create" \
-H "Authorization: YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"my-dataset", "title":"My Dataset"}'
主要APIエンドポイント
データセット(Package)API
取得系
-
package_list- データセット一覧 -
package_show- データセット詳細 -
package_search- データセット検索 -
package_autocomplete- データセット自動補完
更新系
-
package_create- データセット作成 -
package_update- データセット更新 -
package_patch- データセット部分更新 -
package_delete- データセット削除
リソース(Resource)API
取得系
-
resource_show- リソース詳細 -
resource_search- リソース検索
更新系
-
resource_create- リソース作成 -
resource_update- リソース更新 -
resource_patch- リソース部分更新 -
resource_delete- リソース削除
グループ・組織API
取得系
-
group_list- グループ一覧 -
organization_list- 組織一覧 -
group_show- グループ詳細 -
organization_show- 組織詳細
更新系
-
group_create- グループ作成 -
organization_create- 組織作成 -
group_update- グループ更新 -
organization_update- 組織更新
ユーザーAPI
取得系
-
user_list- ユーザー一覧 -
user_show- ユーザー詳細 -
user_autocomplete- ユーザー自動補完
更新系
-
user_create- ユーザー作成 -
user_update- ユーザー更新 -
user_patch- ユーザー部分更新
タグAPI
-
tag_list- タグ一覧 -
tag_show- タグ詳細 -
tag_search- タグ検索 -
tag_autocomplete- タグ自動補完
システム情報API
-
status_show- システム状態表示 -
config_option_show- 設定オプション表示 -
vocabulary_list- 語彙一覧
カスタムプラグインの作成方法
CKANの最大の特徴の一つは、プラグインシステムによる拡張性です。
結構簡単にプラグイン作れます。
1. プラグインプロジェクトの作成
以下でプラグインのテンプレートが作れます。
# CKAN拡張の雛形作成
ckan generate extension --output-dir /path/to/extensions
# 拡張ディレクトリに移動
cd /path/to/extensions/ckanext-myextension
2. 基本的なプラグインクラス
# ckanext/myextension/plugin.py
import ckan.plugins as plugins
import ckan.plugins.toolkit as toolkit
class MyExtensionPlugin(plugins.SingletonPlugin):
plugins.implements(plugins.IConfigurer)
# IConfigurer
def update_config(self, config_):
toolkit.add_template_directory(config_, 'templates')
toolkit.add_public_directory(config_, 'public')
toolkit.add_resource('fanstatic', 'myextension')
3. プラグインの登録
# setup.py
from setuptools import setup, find_packages
setup(
name='ckanext-myextension',
version='0.0.1',
packages=find_packages(),
include_package_data=True,
entry_points='''
[ckan.plugins]
myextension=ckanext.myextension.plugin:MyExtensionPlugin
''',
)
4. プラグインのインストールと有効化
設定ファイルで有効化しないと、pip install しても使えないのでご注意を。
# 開発モードでインストール
pip install -e .
# 設定ファイルでプラグインを有効化
# ckan.plugins = datastore datapusher myextension
主要なプラグインインターフェース
IDatasetForm
データセットフォームのカスタマイズ
class MyPlugin(plugins.SingletonPlugin, toolkit.DefaultDatasetForm):
plugins.implements(plugins.IDatasetForm)
def create_package_schema(self):
schema = super().create_package_schema()
schema.update({
'custom_field': [toolkit.get_validator('ignore_missing'),
toolkit.get_converter('convert_to_extras')]
})
return schema
IActions
カスタムAPIアクションの追加
def custom_action(context, data_dict):
return {'result': 'custom action executed'}
class MyPlugin(plugins.SingletonPlugin):
plugins.implements(plugins.IActions)
def get_actions(self):
return {'custom_action': custom_action}
ITemplateHelpers
テンプレートヘルパー関数の追加
def custom_helper():
return "Helper function result"
class MyPlugin(plugins.SingletonPlugin):
plugins.implements(plugins.ITemplateHelpers)
def get_helpers(self):
return {'custom_helper': custom_helper}
まとめ
CKANについてまとめてみました。Flaskの上で動くものとしては、元のFlaskのインターフェースを踏襲する形で使いやすく実装されているなと感じています。日本語で使う場合は、Solrをどうにかすることが必要ですが、それ以外は割とシームレスに使えると思います。
まだイメージでしかないですが、社内でフォーマットとかが統一された情報があった場合、このシステムを社内で作って、AIが読み込む用のMCPサーバなどを作ったら、社内のAI活用がはかどるんじゃないかなーとか思っています。