Obsidian Dataviewで保存したWebコンテンツをクエリする
数週間にわたって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:
---
タグを統一する
標準のセットを決めて一貫させましょう。Reactやreactjsではなくreact。perfやweb-performanceではなくperformance。不統一なタグはDataviewクエリを壊します。
読んだらステータスを更新
statusフィールドは更新してこそ機能します。クリップを読み終えたら、10秒かけてstatus: unreadをstatus: 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は、クリーンな検索結果を意味します。
はじめよう
- ObsidianにDataviewプラグインをインストール(コミュニティプラグイン → 「Dataview」を検索)
- クリーンなWebクリッピングのためにSaveをインストール
- 上記のテンプレートを使って次の5つのクリップにフロントマターを追加
- リーディングキュークエリ付きのDashboardノートを作成
- ファイルの山がクエリ可能なナレッジベースに変わるのを実感する