ハロー!プロジェクトのメンバーのアメブロを、本文から横断検索できるようにした個人サイトです。 どうやって記事を集め、何を保存し、何をしないと決めているかを説明します。 ソースコードは公開していません。同じ作りの巡回プログラムが増えると、アメブロ側の負担になるためです。
1. 全体の作り
Cloudflare Workers と D1(SQLite)で動いています。サーバーやコンテナはありません。 巡回プログラムが定期的にアメブロの記事を読み、本文を検索用の索引に入れます。 検索のたびにアメブロへ問い合わせることはありません。
どのブログ・どのテーマが誰の記事かは、手で管理している対応表で決めています。 対応表を直すと、次の巡回で取り込み済みの記事の書き手も直ります。
2. 検索のしかた
形態素解析(単語への分割)は使わず、本文を2文字ずつ区切った索引で引いています。 辞書に載らない固有名詞・当て字・口語にも強く、入力した文字列がそのまま並んでいる記事を探す「部分一致」に近い動きになります。
- 全角・半角、英字の大文字・小文字は区別しません
- 記号・句読点・改行・絵文字は無視します。「りんご飴」で「りんご、飴」も見つかります
- 空白で区切ると、すべての語を含む記事に絞り込みます(最大5語・100文字)
- 漢字は1文字でも検索できます。ひらがな・カタカナ・英数字の1文字だけでは検索しません(ヒットが多すぎるため)
結果は新しい記事から順に並びます。総ヒット件数は表示しません。 数えるだけで検索そのものより重くなるためです。 長すぎる検索語や記号だけの検索語は、黙って切ったり無視したりせず、理由を画面に出します。
3. 表示するもの
検索結果には、一致した箇所の前後40字ほどだけを出します(1記事につき最大2か所)。 絵文字や記号は元の本文のまま表示します。 記事を読むときは ameblo.jp の元記事へ移動します。このサイトの役目は、元記事を見つけて送り届けることです。
4. アメブロへの配慮
- 読み込みは1秒に1回まで。並列では取りに行きません
- 1回の巡回の時間とリクエスト数に上限を設け、上限に達したら次の回に回します
- 記事一覧で分かることは一覧だけで済ませ、記事ページはなるべく開きません
- 初回の取り込みは数日かけてゆっくり進めました。急ぐ理由がないからです
5. 編集・削除への追従
取り込み済みの記事も定期的に見直しています。 編集された記事は本文を取り直し、索引も入れ替えます。
削除・非公開になった記事は、このサイトからも消します。 ただし「本当に無くなった」と確かめてからです。 通信の失敗やアメブロ側の一時的な不調を削除と取り違えないよう、確かめられなかったものは消さずに次の見直しに回します。
6. わかっている制約
- ひらがなとカタカナは別扱い。「りんご」で「リンゴ」は出ません。書き分けを潰したくないので、このままにしています
- アクセント付きのラテン文字は落ちます(「Café」は「caf」として扱われます)
- 並びはほぼ投稿順ですが、予約投稿では数分ほど前後することがあります
- グループブログで、テーマが付いていない記事などは書き手を決められず、メンバーでの絞り込みに出ないことがあります
7. 取らない・やらないと決めたこと
- 画像・動画は1バイトも保存しない。文字だけです
- アメンバー限定記事の本文は取り込まない
- 本文中のリンクカードや X・Instagram の埋め込みは除く(本人の文章ではなく、検索のノイズになるため)
- 本文の全文は画面に出さない
- 誰の記事か決められないものに、推測でメンバーを割り当てない
- 並列での取得や、取得間隔の短縮はしない
消してほしい・載せないでほしいという連絡があれば、そのとおりに対応します。 ご連絡は、karin-archive(同じ作者のサイト)のページ下にある「誤りの報告・追加のご要望」から送ってください。