調査日 : 2026-02-24
対象 : GakuNin RDM (GRDM) の Search API
ソースコード : RCOSDP/RDM-osf.iowebsite/search/ ディレクトリ)
開発者ガイド : RCOSDP/RDM-developer-guide
注意 : Search API の公式ドキュメントは確認できませんでした。本稿は API の実際の挙動とソースコードの両方に基づく調査記録です。


概要

GakuNin RDM は OSF (Open Science Framework) のフォークであり、ソースコードは GitHub (RCOSDP/RDM-osf.io) で公開されています。検索機能の実装は website/search/ ディレクトリにあり、主に以下のファイルで構成されています。

ファイル役割
elastic_search.pyインデックスのマッピング定義、ドキュメントの登録・更新
views.pyAPI エンドポイントのハンドラ
util.pybuild_private_search_query() 等のクエリ構築
search.py上位インターフェース
PAOuStThohrtitzpast:i/nr:dmB.enairie.rac<.jp/api/v1/sea>rch/

日本語環境では Elasticsearch の kuromoji_analyzer が使用されています(ソースコードで確認)。


リクエスト形式

{}""}""ae,hspl"}""ioiaq,fsgr_su"}rihtvtefozl"eiri"}mei:rcylq""gss"tu"}::h"ie:eeqtmoarru""01"onr{eyedq,0:d"cd"reui:h":yfe"f_:_arti{d{suyie"s{tl"tdvlrt:l_e"i_edn:nf":edgi3so{"e0cr:l,""dn:{"a:m"eg"":r_3da0ml,"lu,"s,e"rv:e3r0s,itoenx"t::122}4,,comments.*:124",
パラメータ説明備考
api_versionvendor: "grdm", version: 2version は 1 と 2 をサポートしています(ソースコードで確認)
elasticsearch_dsl.queryElasticsearch Query DSLfiltered 形式(ES 2.x 系構文)です
from / sizeページネーションsize=100 まで動作を確認しています。match_all + size>50 では 500 エラーになります
highlightフィールド名:文字数 形式GRDM 独自フォーマットです。ワイルドカード(comments.*)も使えます
sortソート順後述します

sort の選択肢

ソースコード(util.pybuild_private_search_query)によると、以下のソート対象が定義されています。

sort 値動作確認説明
modified_desc / modified_asc確認済み更新日順
created_desc / created_asc確認済み作成日順
project_desc / project_asc未確認プロジェクト名順(ソースに定義あり)
file_desc / file_asc未確認ファイル名順(ソースに定義あり)
wiki_desc / wiki_asc未確認Wiki名順(ソースに定義あり)
user_desc / user_asc未確認ユーザー名順(ソースに定義あり)
institution_desc / institution_asc未確認機関名順(ソースに定義あり)

relevance, title_asc 等はソースに定義がなく、実際に 400 エラーとなることを確認しました。


インデックスに登録されるフィールド(ソースコードより)

ソースコード elastic_search.pyupdate_file(), update_node(), update_user() から、各カテゴリでインデックスに登録されるフィールドを確認できます。

file(update_file()

フィールドソース_all 検索備考
namefile_.nameヒットしますハイライト確認済み
normalized_nameunicode_normalize(file_.name)kuromoji 用
node_titletarget.titleヒットします所属プロジェクト名
creator_nameユーザー情報から取得ヒットします
modifier_nameユーザー情報から取得未確認
tagsファイルのタグヒットしますハイライト確認済み
normalized_tags正規化タグヒットしますハイライト確認済み
extra_search_termsclean_splitters(file_.name)未確認ファイル名をトークン分割したもの
commentscomments_to_doc()未確認テストデータになし
node_publictarget.is_publicフィルタ用
node_contributorsコントリビュータID一覧権限フィルタ用
deep_urlファイルURL表示用
date_created / date_modified日時ソート用
category"file" 固定

folder_nameparent_title / parent_url はインデックスに含まれません。 これらはレスポンス時に format_results() で動的に付与されます(ソースコードで確認)。

project(update_node()

フィールドソース_all 検索備考
titlenode.titleヒットします
normalized_title正規化タイトルkuromoji 用
descriptionnode.descriptionヒットしますハイライト確認済み
normalized_description正規化説明文kuromoji 用
tagsプロジェクトタグヒットします
normalized_tags正規化タグ
contributorsコントリビュータ情報
creator_name作成者名ヒットします
commentsコメント未確認
wikisWiki コンテンツ未確認動的テンプレートでマッピングされます
licenseライセンス情報表示用
affiliated_institutions所属機関
boostブースト値

user(update_user()

フィールドソース備考
useruser.fullname
normalized_user / normalized_names正規化名
job / job_title職業情報
ongoing_job / ongoing_job_department / ongoing_job_title現在の勤務先
school / ongoing_school*学歴
emailsメールアドレス
socialSNS リンク
boost2 固定ユーザーの検索スコアを上げるために設定されています

その他のカテゴリ(ソースコードに定義あり)

ソースコードによると、file, project, user 以外に以下のカテゴリも存在します。

  • component — プロジェクトのサブコンポーネント
  • registration — 登録(スナップショット)
  • preprint — プレプリント
  • wiki — Wiki ページ(text フィールドに本文が入ります)
  • comment — コメント
  • institution — 機関
  • collectionsubmission — コレクション投稿

text ハイライトフィールドは Wiki ページのコンテンツ を対象としたものである可能性が高いです(ファイル本文ではありません)。


_all フィールドの検索対象

Elasticsearch マッピング(ソースコードより)

_all フィールドは kuromoji_analyzer で解析されます。ソースコードの create_index() では、各フィールドに対してアナライザが設定されており、アナライザが設定されたフィールドは _all に含まれます。

実験で確認した検索対象

検索語マッチしたフィールドカテゴリハイライトで確認
"2507"name(ファイル名)filehighlight[name]
"dmp-project-aaa"node_title(プロジェクト名)file
"Nakamura"creator_name(作成者名)file
"blockchain"tags(タグ)filehighlight[tags]
"arxiv"tags / normalized_tagsfilehighlight[tags], highlight[normalized_tags]
"アーカイブズ学"description(プロジェクト説明)projecthighlight[description]
"digital-preservation"tags(プロジェクトタグ)project

検索対象外であることを確認

検索語対象フィールドカテゴリ理由
"NII Storage"folder_namefileインデックスに含まれません(format_results() で動的付与)
"digital preservation framework"file_descriptionfileDataCite メタデータは検索対象外です
"Clio-X".txt ファイル本文fileファイル本文はインデックスされません
"Victoria Lemieux".txt ファイル本文file同上

フィルタ

フィルタ形式結果
{"term": {"category": "file"}}動作します
{"and": [{"term": ...}, {"term": ...}]}動作します
{"bool": {"should": [...]}}動作します
{"bool": {"must": [...]}}500 エラーになります

bool + must が失敗する原因は不明です。ソースコード上は build_private_search_query() 内で bool + must が使用されているため、API ラッパー側の制約と推測されます。回避策として and フィルタまたは query_string の AND 構文を使用できます。


ハイライト

確認済み

フィールドカテゴリ確認した検索語
namefile"ip2"
tagsfile"blockchain", "arxiv"
normalized_tagsfile"arxiv"
descriptionproject"アーカイブズ学"

未確認

  • text — ソースコードによると Wiki ページの本文がこのフィールドに入ります。Wiki のあるプロジェクトでテスト可能と思われます。
  • comments.* — コメントの動的フィールドです。テストデータにコメントがなかったため未確認です。
  • title — プロジェクトタイトルです。検索語がタイトルに一致するケースでテスト可能です。
  • user — ユーザー名です。

DataCite メタデータ

編集可能フィールド

/v2/files/{id}/metadata_records/ で管理されます。ただし OSF が編集を許可するフィールドは以下の4つに限定されています(バリデーションスキーマで確認)。

フィールド説明
resource_typeenumAudio/Video, Dataset, Image, Model, Software, Book, Funding Submission, Journal Article, Lesson, Poster, Preprint, Presentation, Research Tool, Thesis, Other
file_descriptionstringファイルの説明文
related_publication_doistring関連出版物の DOI(10.xxxx/yyyy 形式)
fundersarray[{"funding_agency": "...", "grant_number": "..."}]

DataCite v4.0 スキーマの全フィールド(titles, creators, subjects, descriptions 等)は定義されていますが、OSF の入力バリデーションにより上記4つ以外は Additional properties are not allowed エラーになります。

検索との関係

file_description に値を設定して検索しましたが、ヒットしませんでした 。ソースコード update_file() にも DataCite メタデータを読み出す処理はなく、DataCite メタデータは検索インデックスに含まれません


まとめ

確認できたこと

API の挙動(実験):

  • /api/v1/search/ は Elasticsearch Query DSL ベースの検索 API です
  • file, project, user の3カテゴリを横断検索できます
  • _all 全文検索は name, node_title, creator_name, tags, description にヒットします
  • フィールド指定クエリ(name:, tags:, category:)、ワイルドカード、AND/OR 演算子が使えます
  • term / and / bool+should フィルタが動作します
  • sortmodified_desc/asc, created_desc/asc の4種で動作を確認しました
  • size は 100 まで動作を確認しました
  • ハイライトは name, tags, normalized_tags, description で動作を確認しました

ソースコードから確認:

  • 日本語環境では kuromoji_analyzer が使用されます
  • folder_name, parent_title, parent_url はインデックスに含まれず、レスポンス時に動的付与されます
  • text ハイライトフィールドは Wiki ページのコンテンツ用です
  • sortproject, file, wiki, user, institution, created, modified の各方向が定義されています
  • api_versionversion 1 と 2、vendor"grdm" をサポートしています
  • file, project, user 以外に component, registration, preprint, wiki, comment, institution のカテゴリが存在します

検索対象外であることを確認

  • テキストファイルの本文.txt 内の文章)— 実験とソースコードの両方で確認しました
  • DataCite メタデータfile_description 等)— 実験とソースコードの両方で確認しました
  • folder_name (ストレージプロバイダ名)— 実験とソースコードの両方で確認しました

未確認

  • comments_all 検索でヒットするかどうか
  • Wiki コンテンツ(text フィールド)の検索動作
  • project_desc 等のソート値の動作
  • size の正確な上限
  • bool + must フィルタが 500 エラーとなる原因

参考リンク