プアマンズ・サーチ

817 Views

July 17, 24

スライド概要

https://shibuyarb.connpass.com/event/324064/ の LT で喋ったやつです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

プアマンズ・サーチ @genya0407 at Shibuya.rb[:20240717]

2.

自己紹介 ● ● ● X: @genya0407 GitHub: @genya0407 mastodon: @[email protected] ○ 自分用のサーバーを立てて使っている 今日はこの話

3.

mastodon ● mastodon: 分散型ソーシャルネットワーク ○ ○ ● mastodon サーバー ○ ○ ○ ● ミニ X みたいなサーバーが沢山ある ■ 機能(post / repost / like, …) は大体同じ ミニ X 同士がサーバー間で通信する ■ 他サーバーの投稿も見れる 有名なところで行くと mstdn.jp / fedibird.com / pawoo.net など ■ 規模は 数万アクティブユーザー 〜 おひとり様サーバーまで様々 自分でサーバーを建てることもできる ■ fork して機能を追加することもできる Ruby on Rails 製 social.genya0407.link ○ genya0407 のおひとり様サーバー

4.

mastodon の全文検索 ● ● SNS でやりたいことといえば全文検索 mastodon にも検索機能はあるが、デフォルトでは無効化されている ○ ● Elasticsearch を運用したくない ○ ● 検索機能を有効にするためには Elasticsearch が必要 リソースめっちゃ食う & 運用にノウハウが要求される印象 RDBMS で検索すればいいじゃない ○ → プアマンズ・サーチ

5.

https://www.oreilly.co.jp/books/9784873115894/ プアマンズ・サーチ (poor man’s search) ● 貧者のサーチエンジン ○ ○ ● パターンマッチにより全文検索を行う( i.e. LIKE 句) 『SQLアンチパターン』で解説されているアンチパターン ■ パフォーマンスの低下・意図しない検索結果 social.genya0407.link でのプアマンズ・サーチ ○ ○ ○ 利用者は自分だけ、かつ、そんなに頻繁に検索しない ■ → 現実的な遅さなら許容可能 あいまい検索ナシ、意図せぬ検索結果がでても良い(ことにした) ■ → 高度な検索はできなくてもいい つまりプアマンズ・サーチで良さそう

6.

LIKE句による検索機能の実装 サービスクラスをうまいこと差し込む https://github.com/genya0407/mastodon/pull/32 クエリから LIKE 句を生成して投げる サービスクラスを定義 テストもあるよ!

7.

検索できるようになった!

8.

推しコード ● ● 検索クエリから SQL を組み立てて投げる処理 ActiveRecord::Relation を Enumerable#reduce している ○ ○ ● 任意長の単語配列からいい感じの~ AND LIKE xxx AND ~ を生成 一時変数が不要 & 破壊的変更が不要 reduce を決めると宣言的に書けるので気持ちがいい ○ 仕事ではやらない方がいいかも https://github.com/genya0407/mastodon/blob/04c799836ccac3e4ea6e04df7eb77b4 b8ec97f9b/app/services/poormans_statuses_search_service.rb#L31-L35

9.

まとめ ● ● ● ● mastodon の自鯖を立てて運用・利用している 全文検索が欲しいが Elasticsearch を運用したくない SQL で全文検索する機能を作った reduce を決めると気持ちがいい