
2026/02/23 6:41
アルゴリア・ハッカーニュース検索 – GitHub プロジェクト(アーカイブ済み)
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
HN Search Rails 5 プロジェクト(https://github.com/algolia/hn-search からクローン)では、Firebase のリアルタイム API を介して HackerNews データを取得し、
でサムネイルをレンダリングし、React フロントエンドを公開します。wkhtmltoimage
リポジトリをクローンした後、を実行して Ruby Gem を取得し、次に例の認証情報(bundle install、config/database.example.yml)を本番用ファイルへコピーし、必要に応じて編集します。SQLite3 データベースはconfig/application.example.ymlで初期化されます。rake db:migrate
UI アセット(JS、HTML、CSS)はに配置されています。開発環境では Guard を使用して自動リロードを行い、アプリはローカルの http://localhost:3000 で起動します。app/assets
デプロイメントは Capistrano を利用します。サーバーへの SSH アクセスが必要で、2018 年 12 月の bluepill バグにより、各デプロイ後にを実行する必要があります。Thin サーバープロセスは孤立したインスタンスを残すことがあるため、手動で終了させる必要があります(bundle exec cap deploy:restart→ps aux | grep thin)。kill <pid>
Algolia のインデックス設定はモデルに記述されています。検索対象属性には title, story_text, comment_text, url, story_url, author, および story_title が含まれます。カスタムランキングは降順のポイントとコメント数を使用し、標準ランキング基準(typo, proximity, attribute, custom)も設定されています。フィルタリング用タグには item type、author (Item)、および story ID (author_<name>) が含まれます。story_<id>
このガイドは、開発者が高速で検索可能な HackerNews フロントエンドを構築できる再現性のあるワークフローを提供し、類似した検索アプリケーションの参考資料として機能します。
本文
HN Search – Algoliaによる検索エンジン
概要
このプロジェクトは、Hacker News の検索機能を提供する Rails 5 アプリケーションです。
- フロントエンドでは React を採用しています。
が検索層を担います。algoliasearch‑rails
はクローリングしたページのサムネイルを生成します。wkhtmltoimage
開発 / コントリビューション
Pull Request には大歓迎です!
セットアップ
# リポジトリをクローン git clone https://github.com/algolia/hn-search cd hn-search # 依存関係のインストール bundle install # 設定ファイルを作成(必要に応じて編集可) cp config/database.example.yml config/database.yml cp config/application.example.yml config/application.yml # データベースマイグレーション (デフォルトは SQLite3) bundle exec rake db:migrate # Guard を起動してライブリロード・通知等を有効化 bundle exec guard
ブラウザで
http://localhost:3000 にアクセスするとアプリが確認できます。
コードベース
UI は
app/assets 配下にあり、JS・HTML・CSS が集約されています。
デプロイ
Capistrano を使用しています。デプロイ対象サーバーへ SSH アクセスが必要です。
注 (2018年12月): Bluepill が原因でデプロイが停止する場合があります。その回避策は次のとおりです:
bundle exec cap deploy:restart
Thin サーバーに関しては、デプロイ後に孤立した Thin プロセスが残ることがあり、
ChunkLoadError を引き起こす可能性があります。対処法は以下の通りです:
- 各サーバーへ SSH でログイン
- 孤立した Thin プロセスを検索:
ps aux | grep thin - 手動でプロセスを終了:
kill <old_thin_pid>
インデックス設定
Item モデルが Algolia の設定を行っています:
class Item < ActiveRecord::Base include AlgoliaSearch algoliasearch per_environment: true do # Algolia に送信する属性 attribute :created_at, :title, :url, :author, :points, :story_text, :comment_text, :num_comments, :story_id, :story_title attribute :created_at_i { created_at.to_i } # ランキング優先度(unordered ブースト) attributesToIndex [ 'unordered(title)', 'unordered(story_text)', 'unordered(comment_text)', 'unordered(url)', 'author', 'created_at_i' ] # ハイライト対象 attributesToHighlight [ 'title', 'story_text', 'comment_text', 'url', 'story_url', 'author', 'story_title' ] # フィルタリング用タグ tags { [item_type, "author_#{author}", "story_#{story_id}"] } # カスタムランキング(最後の基準) customRanking ['desc(points)', 'desc(num_comments)'] # 全体のランキング順序 ranking ['typo', 'proximity', 'attribute', 'custom'] # 単語に含められる文字 separatorsToIndex '+#$' end def story_text item_type_cd != Item.comment ? text : nil end def story_title comment? && story ? story.title : nil end def story_url comment? && story ? story.url : nil end def comment_text comment? ? text : nil end def comment? item_type_cd == Item.comment end end
クレジット
- HackerNews – データソース
- Firebase – リアルタイムクローリング API
- wkhtmltoimage – サムネイルレンダリング