2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CKANとは何か

Last updated at Posted at 2025-08-03

この記事には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活用がはかどるんじゃないかなーとか思っています。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?