← ブログに戻る

Obsidian Dataviewで保存したWebコンテンツをクエリする

· Save Team
obsidiandataviewpluginsmarkdownpkmpower-user

数週間にわたってWebコンテンツをObsidianに保存してきました。Vaultには50、もしかすると100のクリップされた記事があります。でも目当てのものを見つけるには、フォルダをスクロールするか全文検索に頼るしかない。

Dataviewがこれを変えます。MarkdownファイルをデータベースのようにI扱い、メタデータでクエリし、タグでフィルタリングし、日付でソートし、自動更新されるダッシュボードを構築できます。

Webクリップ用のセットアップ方法を紹介します。

Dataviewができること

DataviewはObsidianのプラグインで、SQLライクな構文でノートをクエリできます。すべてのMarkdownファイルが行に。すべてのフロントマターフィールドが列に。すべてのクエリがライブで自動更新されるテーブルを返します。

基盤:フロントマター

Dataviewの威力は、クリップしたファイルの一貫したフロントマターに依存します。SaveでWebコンテンツを保存する際に、このメタデータを追加しましょう:

---
title: "React Server Components: A Complete Guide"
source: "https://example.com/rsc-guide"
clipped: 2026-03-15
type: article
status: unread
tags: [react, server-components, performance]
rating:
---

Webクリップをクエリ可能にするフィールド:

  • clipped --- 保存した日付
  • type --- article、tutorial、documentation、paper、thread
  • status --- unread、reading、read、processed
  • rating --- 読んだ後に1〜5で評価(最初は空欄)
  • tags --- 取り扱っているトピック

必須クエリ

リーディングキュー

未読のクリップを新しい順に表示:

```dataview
TABLE title, type, clipped
FROM "clips"
WHERE status = "unread"
SORT clipped DESC
```

最近読んだもの

過去30日間に処理したもの:

```dataview
TABLE title, rating, tags
FROM "clips"
WHERE status = "read" AND clipped >= date(today) - dur(30 days)
SORT rating DESC
```

トピック別のベストコンテンツ

特定トピックの最高評価クリップを検索:

```dataview
TABLE title, rating, source
FROM "clips"
WHERE contains(tags, "react") AND rating >= 4
SORT rating DESC
```

コンテンツタイプの内訳

各タイプの保存数:

```dataview
TABLE length(rows) AS Count
FROM "clips"
GROUP BY type
SORT length(rows) DESC
```

処理が必要なクリップ

まだレビューしていない保存コンテンツを検索:

```dataview
TABLE title, type, clipped
FROM "clips"
WHERE !rating
SORT clipped ASC
LIMIT 10
```

リサーチダッシュボードの構築

Dashboard.mdというノートを作成し、すべてのクエリを集約します:

# Research Dashboard

## リーディングキュー({{date}})

### 未読記事
(dataviewクエリをここに)

### 読書中
(dataviewクエリをここに)

## 今週の保存
(dataviewクエリをここに)

## 高評価コンテンツ
(dataviewクエリをここに)

## トピック別
(dataviewクエリをここに)

このダッシュボードは開くたびに自動更新されます。手動メンテナンスは不要です。

上級編:インラインクエリ

Dataviewはノート内のインラインクエリもサポートしています。クリップの数やメタデータをどこでも参照できます:

今月 `= length(filter(pages("clips"), (p) => p.status = "read"))` 本の記事を
読みました。平均評価は
`= round(average(filter(pages("clips"), (p) => p.rating).rating), 1)` です。

これはプレーンテキストとしてレンダリングされます:「今月23本の記事を読みました。平均評価は3.8です。」

複雑なクエリにはDataviewJS

より複雑な分析にはDataviewJS(JavaScript)を使います:

```dataviewjs
// 過去8週間の週別クリップ数を表示
const clips = dv.pages('"clips"')
  .where(p => p.clipped)
  .sort(p => p.clipped, 'desc');

const weeks = {};
for (const clip of clips) {
  const week = clip.clipped.toFormat("yyyy-'W'WW");
  weeks[week] = (weeks[week] || 0) + 1;
}

dv.table(
  ["Week", "Clips Saved"],
  Object.entries(weeks).slice(0, 8).map(([week, count]) => [week, count])
);
```

クリーンなデータのためのコツ

テンプレートを使う

すべての保存が一貫するよう、フロントマター付きのクリップテンプレートを作成:

---
title: ""
source: ""
clipped: {{date}}
type: article
status: unread
tags: []
rating:
---

タグを統一する

標準のセットを決めて一貫させましょう。Reactreactjsではなくreactperfweb-performanceではなくperformance。不統一なタグはDataviewクエリを壊します。

読んだらステータスを更新

statusフィールドは更新してこそ機能します。クリップを読み終えたら、10秒かけてstatus: unreadstatus: readに変更し、ratingを追加しましょう。

ソースURLを保持する

sourceフィールドがあれば、いつでもオリジナルに戻れます。Dataviewでクリック可能なリンクとしてレンダリングできます:

```dataview
TABLE title, "[Link](" + source + ")" AS Source
FROM "clips"
WHERE status = "read"
SORT clipped DESC
LIMIT 20
```

ここでクリーンなMarkdownが重要な理由

Dataviewはフロントマターをクエリしますが、クリップの本文も定期的に検索します。ここでSaveのクリーンな抽出が効いてきます。

Vaultで「server components streaming」を検索するとき、見つけたいのはクリップ内の関連する段落であって、ナビゲーションメニュー、Cookieバナー、サイドバーウィジェットではありません。クリーンなMarkdownは、クリーンな検索結果を意味します。

はじめよう

  1. ObsidianにDataviewプラグインをインストール(コミュニティプラグイン → 「Dataview」を検索)
  2. クリーンなWebクリッピングのためにSaveをインストール
  3. 上記のテンプレートを使って次の5つのクリップにフロントマターを追加
  4. リーディングキュークエリ付きのDashboardノートを作成
  5. ファイルの山がクエリ可能なナレッジベースに変わるのを実感する