はじめる
FastFind で何が作れますか?
FastFind は 自分の PC の中に小さな検索サーバーを立ち上げることができます。そのため、ほかのプログラムが検索結果を受け取れます。
0.81 から、Web 接続は既定でオフです。 設定 → ウェブ接続でオンにして初めて、下の REST API が開きます。オンにせずに接続する方法もあります — 名前付きパイプ をご覧ください。
- PowerShell・Python スクリプトからファイル一覧を取得
- 自作のランチャー・ツールに検索を組み込む
- 結果の右クリックメニューに 自分の機能を差し込む (プラグイン)
索引はご自身の PC の中だけにあり、外に出ません。サーバーも 127.0.0.1 にしか応答しません。
サーバーはどこで動いていますか?
既定は 9090 番です。設定で変更できます。
ただし、Web 接続をオンにしないと開きません。 オフのときは、プログラムが動いていてもそのポートは存在しません — 待ち受けソケットをそもそも作らないからです。
重複ファイルも API で探せますか?
できます。q にそのまま入れてください — 検索欄に打つのと同じ文法です。
GET /api/search?q=dupe:내용 ext:jpg
GET /api/search?q=dupe: path:D:\사진
GET /api/search?q=empty:
結果は 同じもの同士が並んで 返ります。かたまりの順序は常に同じなので、同じ問い合わせを二度送っても順番が入れ替わりません。
dupe:内容 はファイルを実際に読むため、他の問い合わせより時間がかかります。候補が 2 万件を超えると中身までは比べず、error に案内を入れて返します — 結果が全部だと思って消してはいけないからです。
http://127.0.0.1:9090
プログラムが終了していればサーバーもありません。先に /api/status で起動を確かめてから使うほうが安全です。
実際にこうして作られたものがあります
ブラウザーのスタートページから 自分の PC のファイルを直接探します。 ウェブ検索とローカルファイルを一か所で見ます。
検索語を打つ
読み取りのみ中継
/api/search
ブラウザーが FastFind を直接呼びません。 ウェブ画面に API が露出すると
どのサイトでもファイル一覧を取れてしまうので、信頼できるエージェントが間に立って
読み取りだけ を渡します。
呼ぶ前に /api/status で起動しているかを先に見て、なければ
503 fastfind_not_running を返してインストール案内へ回します。
利用者は FastFind を インストールして起動するだけ です — ログインも設定もありません。
認証
トークンが必要です
誰でもファイル一覧を取れてはいけないので、トークンなしでは応答しません。
次の二つのいずれかで送ってください。
Authorization: Bearer <トークン> | ヘッダーに入れて送る |
ff_local_token=<トークン> | クッキーで送る (ブラウザーから使うとき) |
トークンは /login 画面で受け取ります。この二つのアドレスだけがトークンなしで開きます。
POST /api/local-auth/login
REST API
検索 — GET /api/search
curl -H "Authorization: Bearer $TOKEN" \
"http://127.0.0.1:9090/api/search?q=견적서%20ext:pdf&max=50"
送るもの
q | 検索語。使い方の検索文法 をそのまま使います (ext: size: path: 初声 …) |
max | 最大何件まで (省略すると既定値) |
name_only | true なら名前だけ、false なら全体のパスから |
case | 大文字小文字を区別 |
word | 単語単位で |
regex | 正規表現で |
sort asc | 並べ替えの基準と向き |
raw | 入力した文字そのものだけで探します。 韓国語の語の推測をオフにします — 下をご覧ください |
真偽値は 1 0 true false on off yes no をすべて受け付けます。値を書かない &raw もオンとみなします。
ext: の使い方
ext:jpg,png | カンマで複数 — この形でお使いください |
ext:jpg|png | 使えません。 jpg|png という拡張子ひとつとして読まれ、0件になります |
ext:jpg ext:png | 二回書くと あとのものだけ が残ります |
⚠ プログラムから呼ぶときは raw=1 を付けてください。
既定ではいくつかの語を 人が使いやすいように解釈します。 人には便利ですが、プログラムから呼ぶときは 予告なく問い合わせが変わることので、結果がおかしく見えます。
ただし語を一つだけ送った場合は種類を推測しません。 q=photo は名前に photo が入ったファイルを探します。下の表は 語が二つ以上のとき(例: photo 찾아줘)に適用されます。
photo image 이미지 사진 그림 | → 画像の拡張子すべて(語そのものは消えます) |
doc document 문서 | → 文書の拡張子すべて |
audio music 음악 오디오 | → 音声の拡張子すべて |
video 동영상 영화 영상 | → 動画の拡張子すべて |
엑셀 표 | → xls,xlsx,csv |
큰 작은 대용량 | → サイズ条件 |
10개 상위5 | → 件数制限 |
サイズ順 최신순 가나다순 | → 並べ替え |
フォルダー 파일만 | → 種類で絞る |
GET /api/search?q=photo → 이름에 photo 가 든 파일 (낱말 하나 — 짐작 안 함)
GET /api/search?q=photo 찾아줘 → 이미지 파일 전부 (낱말 둘 — 짐작함)
GET /api/search?q=photo 찾아줘&raw=1 → 이름에 photo 가 든 파일
ext: path: size: などの構文は raw=1 をオンにしてもそのまま効きます。 それは推測ではなく、書かれたそのものだからです。オフにするのは推測だけです。
何と解釈したかは応答に含まれます。
"interpreted": {
"keyword": null, // 실제로 찾은 낱말 (짐작으로 사라지면 null)
"extensions": ["jpg","png", …], // 걸린 확장자
"guessed": true, // ← 참이면 짐작이 낱말을 삼킨 것입니다
"guessed_words": ["photo"], // 무엇 때문에 바뀌었는지
"raw": false
}
guessed true 면 raw=1 で呼び直せば できます。
受け取るもの
{
"results": [
{
"name": "견적서_한빛건설.pdf",
"path": "C:\\작업\\2026\\견적서_한빛건설.pdf",
"size": 284915,
"ext": "pdf",
"modified": 1786012800,
"is_dir": false
}
],
"total": 12,
"time_ms": 5.3,
"query": "견적서 ext:pdf"
}
total は 条件に合う全体の件数 で、results はそのうち返した分です。modified は 1970 年からの秒です。
状態 — GET /api/status
索引が準備できているか、何件入っているかを見ます。検索を送る前にこれを先に確認 すれば、プログラムが終了している場合やまだ索引中の場合を見分けられます。
{
"indexed_files": 4663246,
"version": "0.86.0",
"status": "ready"
}
応答には engine engine_gen mem のような項目も一緒に来ますが、それは 私たちが問題を探すときに使う値 なので予告なく変わります。頼らないでください。
自動補完 — GET /api/suggest
入力中に見せる候補を受け取ります。文字列の配列を一つだけ返します。
GET /api/suggest?q=견적
["견적서_한빛건설.pdf", "견적서_양식.hwp", "견적_2026.xlsx"]
PowerShell での短い例
$t = "여기에 토큰"
$r = Invoke-RestMethod -Uri "http://127.0.0.1:9090/api/search?q=ext:log" `
-Headers @{ Authorization = "Bearer $t" }
$r.results | Select-Object name, path, size | Format-Table
Python での短い例
import requests, urllib.parse
TOKEN = "여기에 토큰"
q = urllib.parse.quote("견적서 ext:pdf")
r = requests.get(f"http://127.0.0.1:9090/api/search?q={q}&max=20",
headers={"Authorization": f"Bearer {TOKEN}"})
for f in r.json()["results"]:
print(f["size"], f["path"])
その他のパス — ありますが約束はしません
下記も開いています。ただし 私たちのウェブ画面が使うために作ったもの なので予告なく変わります。使うとしても 壊れうると承知のうえで お使いください。
GET /api/recent | 最近作られたり直されたファイル |
GET /api/open?path=… | そのファイルを開きます |
GET /api/open-folder?path=… | そのファイルのあるフォルダーを開きます |
GET /api/preview?path=… | プレビュー画像 (画像として返します) |
GET /api/analysis | どこが容量を多く使っているか |
GET /api/browse?path=… | フォルダー内の一覧 |
/api/favorites /add /remove | お気に入り |
/api/smart-folders /add /remove /search | 保存した検索 |
/api/history /clear | 検索履歴 |
この中でよく使うものがあれば お知らせください。使う方がいるものから約束の一覧へ移します。
失敗したとき
| 接続拒否 | Web アクセスがオフになっています(既定値)。または、プログラムが終了しているか、ポートが異なります |
401 | トークンがないか間違っています |
404 | 存在しないパスです |
プログラムはユーザーが終了すると一緒に消え、 ウェブ接続をオンにしなければ、そもそも起動もしません。 常に起動していると考えないでください。呼び出す前に /api/status で確認し、だめなら静かに次へ進むようにしておくのが安全です。
ユーザーに「設定でオンにしてください」とお願いしたくない場合は、 名前付きパイプ をお使いください。ウェブ接続とは関係なく、常に開いています。
ポートはどうやって知りますか?
既定は 9090 ですが、利用者が設定で変えられます。配布するツールなら ポートを尋ねるか設定できるように 作っておいてください。
設定ファイルから読むこともできます。
%LOCALAPPDATA%\FastFind\settings.json
バージョン番号はどこにありますか
/api/status の中にあります。 /api/version · /api/health · /api/info は ありません(404).
機能が使えるかを判定するときは /api/status 의 version をご覧ください。
検索に出てこない場所があります
既定で 取り込まないフォルダーがあります。一時ファイルとシステムフォルダーなので、取り込むと結果が散らかり索引も大きくなります。
| システム | $Recycle.Bin · System Volume Information · Recovery |
| Windows | Windows\WinSxS · Installer · servicing · Temp · Prefetch · SoftwareDistribution |
| インストールの痕跡 | $WINDOWS.~BT · $WINDOWS.~WS · ProgramData\Microsoft |
| ユーザー | AppData\Local\Temp · .cache · node_modules · .git · __pycache__ |
拡張子も tmp · temp · bak · old · lnk · url も取り込みません。
利用者が 設定 → 索引範囲 でこの一覧を変更できるため、PC ごとに異なることがあります。
パイプで接続する
ウェブ接続をオンにせずに接続する方法
0.81 から、Web 接続は既定でオフです。そのため REST API を使うにはユーザーに設定をオンにしてもらう必要がありますが、それはいいお願いではありません。
ではなく 名前付きパイプがあります。Web 接続とは関係なく は常に開いていて、ポートを開きません。
\\.\pipe\FastFind
パイプの上に のような REST ルーターがそのまま載っています。ですからパスもパラメータも応答も、上で説明したものとまったく同じです。 変わるのは通り道だけです — パイプに HTTP リクエストを書き込んで応答を読むだけです。
呼び出し方
Windows ではパイプを ただのファイルのように を開くだけです。特別なライブラリは必要ありません。
GET /api/search?q=견적서 HTTP/1.1
Host: 127.0.0.1
Connection: close
Host は 必ず数字のアドレスでなければなりません。名前を書くと拒否します(DNS リバインディングを防ぐためです)。値を変える要求であれば、 Sec-Fetch-Site: same-origin も付けてください。読み取りだけの要求には必要ありません。
Connection: close 를 を忘れないでください。 なければ接続が維持され、最後まで読もうとする側がいつまでも待ち続けます。「できない」ではなく「止まる」という形で現れるため、見つけにくいのです。
再試行すべき2つのエラー
パイプはインスタンス 1 つにつき接続 1 つです。あらかじめ複数を開いていますが、要求が集中すると一時的に足りなくなることがあります。
231 ERROR_PIPE_BUSY | がいっぱいです。少し待ってからもう一度 |
2 ERROR_FILE_NOT_FOUND | 渡す一瞬です。 これも再試行が必要です |
2 番は「ない」と読んで諦めてしまいがちですが、 ここでは「少し待ってほしい」という意味であることが多いです。どちらの場合も、短い間隔で数回再試行してください(10ms ごとに 5 回で十分です)。それでも 2 が出続けるなら、そのときが本当に「FastFind がない」ときです。
誰が接続できるか
この PC に今ログインしているユーザーだけ だけが接続できます。同じ PC の別のアカウントも、ネットワーク越しも接続できません。
ID やパスワードを入れるものはありません — 接続してきた相手が誰なのかを Windows が教えてくれるので、こちらはパイプを作るときに「このユーザーのみ」と一度書いておくだけです。
プラグイン
プラグインはどう動きますか?
検索結果を右クリックしたときに出るメニューに 自分の機能を差し込む ものです。
プラグインは 別の実行ファイル です。DLL としてアプリの中に入れません — 他人のコードが誤っても FastFind まで落ちてはいけないからです。だから どんな言語でも 作れます。
FastFind → 플러그인 : myplugin.exe --path "C:\\file.txt"
플러그인 → FastFind : 표준출력으로 JSON 한 덩어리
返せるもの
message | お知らせ窓を出します |
copy | クリップボードに入れます |
open | そのパスを開きます |
{"action":"message","title":"줄 수","text":"1,284줄"}
{"action":"copy","text":"복사할 내용"}
{"action":"open","path":"C:\\어딘가"}
いちばん短いプラグイン — Python 5 行
選んだファイルが何行かを数えて知らせるものです。
import sys, json
path = sys.argv[sys.argv.index("--path") + 1]
n = sum(1 for _ in open(path, encoding="utf-8", errors="ignore"))
print(json.dumps({"action": "message", "title": "줄 수",
"text": f"{n:,}줄"}, ensure_ascii=False))
これを exe にして下の場所に置き、隣に plugin.json を置きます。
%LOCALAPPDATA%\\FastFind\\plugins\\linecount\\
run.exe
plugin.json
{
"id": "linecount",
"name": "줄 수 세기",
"description": "고른 파일의 줄 수를 셉니다",
"version": "1.0.0",
"author": "내 이름"
}
FastFind を立ち上げ直すと、結果の右クリックメニューに 行数を数える が出ます。
すでに付いているもの
四つが一緒にインストールされます。作るときの参考にどうぞ。
- ファイル情報 — サイズ・時刻・属性
- ハッシュ — SHA-256 を計算
- 画像情報 — サイズ・形式
- 文字統計 — 行・単語・文字数
約束と限界
どこまで変わらないと約束しますか?
正直に書きます。このページに書いたものだけ を約束します。
/api/search | 約束します。 項目を外したり意味を変えたりしません |
/api/status | indexed_files version status の三項目だけを約束します |
/api/suggest | 約束します |
| プラグイン規約 | 約束します |
| その他のパス | 内部用です。予告なく変わります |
プログラムの中にはこれより多くのパスがありますが、ほとんどは私たちのウェブ画面が使うものです。公開すると簡単には変えられない約束になるので、安定したものだけを選んで ここに書きました。
新しい項目が 増える ことはあります。それは既存のものを壊さないので、知らない項目が来たら無視するように作っておいてください。
今はないもの
- 公式ライブラリがありません。 HTTP で直接呼んでいただく必要があります
- 変更通知 (ウェブフック) がありません。 ファイルができたときに知らせる手段がないので、必要なら問い直していただく必要があります
- プラグインが結果一覧を変えることはできません。 今は右クリックメニューから一つの仕事をするところまでです
必要なものがあれば お知らせください。使う方がいれば作ります。