はじめに
しくみ製作所の西口です。
今年度よりしくみ製作所では、社内において研究発表会という知見を共有するイベントを開催することになりました。
先日第1回目が終了したのですが、「Elasticsearchで検索システムを構築した話」と題し、私が登壇しましたので、その内容をお伝えできればと思います。
研究発表の概要
今回の発表では実際の案件において、Elasticsearch を使い高速な検索システムを構築した話をしました。対象となる案件は、条件付きで CMS を再構築するものです。具体的には、「各種データ(5種類)の検索に関して、レスポンス速度が速くかつ柔軟な条件で検索できること」という条件がありました。
この条件をクリアするために Elasticsearch で検索システムを組むことにしました。メインのデータストアである RDB からデータ自身 + データに紐付けられているS3上の添付ファイルの内容などをできるだけ速く同期させる仕組みを作りました。
結果として、一部問題も残っているものの概ね RDB への更新から10秒ぐらいのラグで、最大500万件ぐらいのデータを数ミリ〜数十ミリ秒で検索できるようになりました。
より具体的な条件
対象となる CMS の刷新にあたって、以下のような柔軟な検索要件がありました。
- あるデータに紐付けられた添付ファイルの中身の文言にマッチする検索
- 紐づく孫データのある項目にマッチするデータの祖父データの検索
- それをレスポンスが悪くなることなく検索できる
私は別のシステムで Elasticsearch を使ったことがあり、Elasticsearch を使えば柔軟かつ検索速度も速いという経験があったため使ってみることにしました。
システムの構成と同期処理
今回の検索システムは、Elasticsearch と Logstash を使って構築しました。
RDB側のテーブルの単位でいうと5テーブルに関してそれらに紐づく親、一部の子テーブルのデータ含めて1テーブル最大500万件ぐらいのデータを Elasticsearch に同期し検索できるようにしました。
RDB と Elasticsearch の同期処理については、Logstash で同期しており、SQL で Easticsearch 側のindex に対応する json を組み立ててそれをそのまま upsert する方式にしました。
添付ファイルについては、ファイルのアップロードと同じタイミングで中身抽出するのが少し難しかったため、別途中身抽出バッチをつくり非同期で添付ファイルの中身を保持するだけのテーブルに更新していき、そのデータの更新をトリガーに Logstash に拾われるようにして同期しました。
一部データ量が多いレコードに関して同期が詰まる問題が合ったりするものの、ほとんどのケースでRDB更新後数十秒程度までには同期され、検索時間も数ミリ〜数十ミリ秒程度で検索できるようになりました。
良かった点
Logstash 方式により同期に多少のラグが発生することとなりましたが、この仕組だけで初期移行、トラブル時の再移行などもまかなえて結果的にはお得に運用できている気がします。
このシステムとは別のシステムで、S3 に置かれた json ファイル -> Elasticsearch の同期に、S3 のファイル作成、削除イベントをトリガーに Lambda を起動し、Elasticsearch への連携処理を実装してみてもいますが、やはりこちらのほうが(正常に実行された場合は)ほぼリアルタイムに連携されるためその点では Logstash よりも優れていそうでした。
悪かった点
ちょうど AWS と Elastic 社の OSS ただのり問題の最中に使用するバージョンを決定することになりました。
結果的にはそれほど新機能は必要でなかったため、その時点での AWS の Elasticsearch (現Opensearch)サービスの最新だった7.9.3で実装しています。結果的には特に問題発生していませんが、その後の Elasticsearch に実装された新機能などが使えないのが少しもったいないと感じています。(例:Elasticsearch の7.11で入ったが Opensearch (= Elasticsearch 7.10互換)ではまだ未実装のランタイムフィールド機能など)
また、何度か出てきていますが、Elasticsearch でのデータの保持の仕方上、RDB でいう、親、子、孫という3階層になっているデータの親データが変更されると、それに紐づく全部の子、孫も自動的に再連携されてしまい、例えば孫データの件数が大量(数十万件ぐらい)だとバッチが詰まることが発生しています。これはまだ完全には解消されてはいません。
さいごに
研究発表会を開催するにあたり、事前にアンケートを実施し社内にて興味のあるテーマを絞り込んでいたこともあってか、業務時間内での開催でしたが、たくさんの方に参加していただきました。ありがとうございました。今回の資料を下記に置いておきますので、ご興味のある方はまたご覧になってください。
研究発表会は第2回、3回と続いていく予定ですので、次回もよろしくお願いします。こうして発表したことが、皆に活用され、実際の開発を手助けするものとなれば嬉しいです。
Elasticsearchで検索システムを作った話(公開用).pdf622.7KB
社内ナレッジ共有の新たな試み・変化の速いAI領域を学ぶ「AIお茶会」
社内ナレッジ共有の新たな試み・変化の速いAI領域を学ぶ「AIお茶会」
2025/07/15
目指す自分へ向かう・問いと決断の軌跡「キャリアの記録〜saito編〜」
目指す自分へ向かう・問いと決断の軌跡「キャリアの記録〜saito編〜」
2025/06/15
盛りだくさんの交流で深まる理解と信頼「しくみオフ会'25.04〜参加編〜」
盛りだくさんの交流で深まる理解と信頼「しくみオフ会'25.04〜参加編〜」
2025/05/15
自分に合ったツールを見つけよう「コード生成AIサービスの特徴・違い・おすすめポイントを整理」
自分に合ったツールを見つけよう「コード生成AIサービスの特徴・違い・おすすめポイントを整理」
2025/04/15
しくみ製作所代表の車より 今月のつぶやき「2025年度に向けて」
しくみ製作所代表の車より 今月のつぶやき「2025年度に向けて」
2025/03/30
第一子の経験を活かして・育休準備と実践の記録「hozum編」
第一子の経験を活かして・育休準備と実践の記録「hozum編」
2025/03/15
「知ろう・仲良くなろう!から始まるキャリア授業」中学校にて講演
「知ろう・仲良くなろう!から始まるキャリア授業」中学校にて講演
2025/02/28
AI時代におけるプロトタイピングの進化と影響について「研究発表会vol.13〜nozomu編〜」
AI時代におけるプロトタイピングの進化と影響について「研究発表会vol.13〜nozomu編〜」
2025/02/15
人と技術が交わるこの場所で丁寧な仕事を「メンバーインタビュー〜ishiduka編〜」
人と技術が交わるこの場所で丁寧な仕事を「メンバーインタビュー〜ishiduka編〜」
2025/01/15
PMへの挑戦と学び・課題解決を追求する道のりで「キャリアの記録〜sakamoto編〜」
PMへの挑戦と学び・課題解決を追求する道のりで「キャリアの記録〜sakamoto編〜」
2024/12/30
育休は取得してほしい!リモートワークで今しかない子供の成長を見守る「育児パパ座談会 vol.02」
育休は取得してほしい!リモートワークで今しかない子供の成長を見守る「育児パパ座談会 vol.02」
2024/12/15
社内で Cursor 実演会を開催しました「研究発表会vol.12〜norikt編〜」
社内で Cursor 実演会を開催しました「研究発表会vol.12〜norikt編〜」
2024/11/30
好きなことを原動力にフルリモートでの働き方を楽しむ「メンバーインタビュー〜harada編〜」
好きなことを原動力にフルリモートでの働き方を楽しむ「メンバーインタビュー〜harada編〜」
2024/11/15
創立10周年記念回・これまでの軌跡も辿って「しくみオフ会'24.10〜参加編〜」
創立10周年記念回・これまでの軌跡も辿って「しくみオフ会'24.10〜参加編〜」
2024/10/30
しくみ製作所代表の車より 今月のつぶやき「2024年度 上期ふりかえり」
しくみ製作所代表の車より 今月のつぶやき「2024年度 上期ふりかえり」
2024/10/15
駆け出しPM奮闘記・開発生産性と向き合う話「研究発表会vol.11〜ikkyu編〜」
駆け出しPM奮闘記・開発生産性と向き合う話「研究発表会vol.11〜ikkyu編〜」
2024/09/30
意識高く行動する文化の中で新しいことにチャレンジしていきたい「メンバーインタビュー〜hanamura編〜」
意識高く行動する文化の中で新しいことにチャレンジしていきたい「メンバーインタビュー〜hanamura編〜」
2024/09/15
フルリモートでも距離を感じない・働き方も考え方も柔軟なしくみ製作所で「メンバーインタビュー〜こっし編〜」
フルリモートでも距離を感じない・働き方も考え方も柔軟なしくみ製作所で「メンバーインタビュー〜こっし編〜」
2024/08/30
創立10周年のご挨拶
Findy Team+を使用した開発生産性向上の取組みについて「ツール導入編」
Findy Team+を使用した開発生産性向上の取組みについて「ツール導入編」
2024/07/30
福利厚生を利用して「開発生産性Conference 2024」 に参加しました
福利厚生を利用して「開発生産性Conference 2024」 に参加しました
2024/07/15
他社文化に馴染みながらアジャイルチームをビルドアップした話「研究発表会vol.10〜sadatoshi編〜」
他社文化に馴染みながらアジャイルチームをビルドアップした話「研究発表会vol.10〜sadatoshi編〜」
2024/06/30
新しい福利厚生「勉強会補助費・社内コミュニケーション補助費」を導入・必要な支援で業務を後押し
新しい福利厚生「勉強会補助費・社内コミュニケーション補助費」を導入・必要な支援で業務を後押し
2024/06/15
仕事人生のラストスパート・覚悟を持って歩んでいきたい「メンバーインタビュー〜uto編〜」
仕事人生のラストスパート・覚悟を持って歩んでいきたい「メンバーインタビュー〜uto編〜」
2024/05/30
プロダクト作り知見共有会を開始・全社で高いパフォーマンスを発揮するために
プロダクト作り知見共有会を開始・全社で高いパフォーマンスを発揮するために
2024/05/15
デザインフォーマットとワークフローを再整備した話「研究発表会vol.09〜デザインハブ編〜」
デザインフォーマットとワークフローを再整備した話「研究発表会vol.09〜デザインハブ編〜」
2024/04/30
テーマは前回よりコミュニケーションを深めよう「しくみオフ会'24.04〜参加編〜」
テーマは前回よりコミュニケーションを深めよう「しくみオフ会'24.04〜参加編〜」
2024/04/15
GA を使わずに滞在時間計測できる環境を作った話「研究発表会vol.08〜kitazumi編〜」
GA を使わずに滞在時間計測できる環境を作った話「研究発表会vol.08〜kitazumi編〜」
2024/03/15
育休は取得してほしい!リモートワークで今しかない子供の成長を見守る「育児パパ座談会 vol.01」
育休は取得してほしい!リモートワークで今しかない子供の成長を見守る「育児パパ座談会 vol.01」
2024/02/15
チームで成果を出すモブプログラミングのすすめ「研究発表会vol.07〜tanukiti編〜」
チームで成果を出すモブプログラミングのすすめ「研究発表会vol.07〜tanukiti編〜」
2024/02/01
怖くないISMS ・ ISMS規格アップデートの話「研究発表会vol.06〜ISMS編〜」
怖くないISMS ・ ISMS規格アップデートの話「研究発表会vol.06〜ISMS編〜」
2023/12/30
行動も後押ししてくれる福利厚生・用途を考えるのも嬉しい時間に「リモートワーク補助金(年間15万円制度)を使ってみた」vol.10
行動も後押ししてくれる福利厚生・用途を考えるのも嬉しい時間に「リモートワーク補助金(年間15万円制度)を使ってみた」vol.10
2023/12/15
淡々と価値を届けられるようになるための話「研究発表会vol.05〜aoki編〜」
淡々と価値を届けられるようになるための話「研究発表会vol.05〜aoki編〜」
2023/11/30
直接会えることの特別感を楽しめたオフ会「しくみオフ会'23.09〜参加編〜」
直接会えることの特別感を楽しめたオフ会「しくみオフ会'23.09〜参加編〜」
2023/11/15
参加できないメンバーにも届けたい!撮影舞台を整え配信も「しくみオフ会'23.09〜裏方編〜」
参加できないメンバーにも届けたい!撮影舞台を整え配信も「しくみオフ会'23.09〜裏方編〜」
2023/10/30
しくみ製作所代表の車より 今月のつぶやき「2023年度 上期ふりかえり」
しくみ製作所代表の車より 今月のつぶやき「2023年度 上期ふりかえり」
2023/10/15
自分自身の意識改革にて成果を上げたPMの話「研究発表会vol.04〜toyokawa編〜」
自分自身の意識改革にて成果を上げたPMの話「研究発表会vol.04〜toyokawa編〜」
2023/09/30
企画や概要設計的な部分までをサポートするツールPoitの開発のきっかけ
企画や概要設計的な部分までをサポートするツールPoitの開発のきっかけ
2023/09/15
RubyとRailsを古いバージョンからアップデートした話「研究発表会vol.03〜kitazumi編〜」
RubyとRailsを古いバージョンからアップデートした話「研究発表会vol.03〜kitazumi編〜」
2023/08/30
go_routerとriverpodを組合わせる「Flutterやってみたシリーズvol.01」
go_routerとriverpodを組合わせる「Flutterやってみたシリーズvol.01」
2023/08/15
リーンサイクルを強化する KPI 計測基盤を作った話「研究発表会vol.02〜hozum編〜」
リーンサイクルを強化する KPI 計測基盤を作った話「研究発表会vol.02〜hozum編〜」
2023/07/15
「ゲームをより楽しむためのコントローラー自作」あなたのゲームライフをもっと充実させてみませんか
「ゲームをより楽しむためのコントローラー自作」あなたのゲームライフをもっと充実させてみませんか
2023/06/30
かくれんぼの立上げから3年・まだまだ挑戦は続く「地方での暮らしと活動〜toyokawa編〜」
かくれんぼの立上げから3年・まだまだ挑戦は続く「地方での暮らしと活動〜toyokawa編〜」
2023/06/15
Elasticsearch で高速な検索システムを構築した話「研究発表会vo.01〜ynishi編〜」
Elasticsearch で高速な検索システムを構築した話「研究発表会vo.01〜ynishi編〜」
2023/05/30
ChatGPT や GitHub Copilot を導入・情報流出リスクを考慮した AI サービスの活用をご紹介
ChatGPT や GitHub Copilot を導入・情報流出リスクを考慮した AI サービスの活用をご紹介
2023/05/15
適度にカジュアルでリラックスした社内・それを維持できるだけの責任感やスキルのあるメンバーに囲まれて「メンバーインタビュー〜matsubayashi編〜」
適度にカジュアルでリラックスした社内・それを維持できるだけの責任感やスキルのあるメンバーに囲まれて「メンバーインタビュー〜matsubayashi編〜」
2023/04/30
リモートワーク生活を充実させるための福利厚生である「リモートワーク補助金」が5万円パワーアップ・使用用途もご紹介
リモートワーク生活を充実させるための福利厚生である「リモートワーク補助金」が5万円パワーアップ・使用用途もご紹介
2023/04/15
しくみ製作所代表の車より 今月のつぶやき「2023年度に向けて」
しくみ製作所代表の車より 今月のつぶやき「2023年度に向けて」
2023/03/25
バランスボール部も結成・リモートワーク歴6年目のエンジニアが語る「バランスボールの効果」
バランスボール部も結成・リモートワーク歴6年目のエンジニアが語る「バランスボールの効果」
2023/03/15
オフ会に初参加・やっぱりオフラインもいいね「しくみオフ会'23.02〜参加編〜」
オフ会に初参加・やっぱりオフラインもいいね「しくみオフ会'23.02〜参加編〜」
2023/03/05
会えるだけで価値とするオフ会を3年ぶりに開催「しくみオフ会'23.02〜企画編〜」
会えるだけで価値とするオフ会を3年ぶりに開催「しくみオフ会'23.02〜企画編〜」
2023/02/25
PJをリードできるメンバーが継続的に生まれる環境をつくるための「PMコーチング」をご紹介
PJをリードできるメンバーが継続的に生まれる環境をつくるための「PMコーチング」をご紹介
2023/02/15
Cocodaに新規事業の構想から伴走し支援する「つくらないプロダクト開発」の解説記事が掲載
Cocodaに新規事業の構想から伴走し支援する「つくらないプロダクト開発」の解説記事が掲載
2023/02/05
多様な技術やサービスに触れられる環境が魅力・今後も様々なことを自分で設計しながら楽しみたい「メンバーインタビュー〜timai編〜」
多様な技術やサービスに触れられる環境が魅力・今後も様々なことを自分で設計しながら楽しみたい「メンバーインタビュー〜timai編〜」
2023/01/25
学習や情報交換の場であるモバイルハブで「アプリコンテスト開催」・日頃の取組みやメンバーも紹介
学習や情報交換の場であるモバイルハブで「アプリコンテスト開催」・日頃の取組みやメンバーも紹介
2023/01/15
SIerからの転職・目標実現のためにサポートや挑戦できる環境を活かしたい「ポテンシャル枠奮闘記〜ichikawa編〜」vol.01
SIerからの転職・目標実現のためにサポートや挑戦できる環境を活かしたい「ポテンシャル枠奮闘記〜ichikawa編〜」vol.01
2023/01/05
「業務委託の働き方」をご紹介・それぞれの働きにあった雇用形態を選択できる環境
「業務委託の働き方」をご紹介・それぞれの働きにあった雇用形態を選択できる環境
2022/12/25
「つくらないプロダクト開発」の重要パーツであるKPI計測基盤・広報の例を紹介
📈
「つくらないプロダクト開発」の重要パーツであるKPI計測基盤・広報の例を紹介
2022/12/15
成長に繋がる経験を活かして頼られる存在になりたい「ポテンシャル枠奮闘記〜kazuki編〜」vol.01
成長に繋がる経験を活かして頼られる存在になりたい「ポテンシャル枠奮闘記〜kazuki編〜」vol.01
2022/12/05
「コンパクトガバナンス宣言」を制定・ホラクラシーをベースに新しい運営を開始
「コンパクトガバナンス宣言」を制定・ホラクラシーをベースに新しい運営を開始
2022/11/25
「快適な仕事環境のための自作キーボード入門」今より少しだけキーボードを気にかけてみませんか
「快適な仕事環境のための自作キーボード入門」今より少しだけキーボードを気にかけてみませんか
2022/11/15
「いい仕事を生み出す進路選択実践例をご紹介」高崎東高校で 働くについて講演vol.02
「いい仕事を生み出す進路選択実践例をご紹介」高崎東高校で 働くについて講演vol.02
2022/11/05
ホラクラシー憲法5.0を日本語に翻訳・2019年から導入し今後の展望も
ホラクラシー憲法5.0を日本語に翻訳・2019年から導入し今後の展望も
2022/10/25
候補者に伝えたいこと「一緒に働きたい人としくみ製作所の魅力」
候補者に伝えたいこと「一緒に働きたい人としくみ製作所の魅力」
2022/10/15
しくみ製作所代表の車より 今月のつぶやき「2022年度 上期ふりかえり」
しくみ製作所代表の車より 今月のつぶやき「2022年度 上期ふりかえり」
2022/10/05
改善を止めない姿勢が浸透していることに感動・価値ある活躍を目指して「ポテンシャル枠奮闘記〜kitazumi編〜」vol.01
改善を止めない姿勢が浸透していることに感動・価値ある活躍を目指して「ポテンシャル枠奮闘記〜kitazumi編〜」vol.01
2022/09/29
インターナルコミュニケーションの土台が完成・今後もメンバーが盛り上がることのできる環境を「Slackワイワイプロジェクト」vol.02
インターナルコミュニケーションの土台が完成・今後もメンバーが盛り上がることのできる環境を「Slackワイワイプロジェクト」vol.02
2022/09/22
しくみ製作所らしさ満点のスタンプが誕生・行動指針の浸透や積極的なリアクションを目指して「Slackワイワイプロジェクト」vol.01
しくみ製作所らしさ満点のスタンプが誕生・行動指針の浸透や積極的なリアクションを目指して「Slackワイワイプロジェクト」vol.01
2022/09/15
充実したドキュメントでフルリモートの不安も払拭・相談しやすい環境に感謝「ポテンシャル枠奮闘記〜ikkyu編〜」vol.01
充実したドキュメントでフルリモートの不安も払拭・相談しやすい環境に感謝「ポテンシャル枠奮闘記〜ikkyu編〜」vol.01
2022/09/01
ゼロから立ち上げたかくれんぼinぐんま・今ではライフワークに「地方での暮らしと活動〜toyokawa編〜」
ゼロから立ち上げたかくれんぼinぐんま・今ではライフワークに「地方での暮らしと活動〜toyokawa編〜」
2022/08/25
エンジニアライフの手助けにと始めた「グループコーチング」副次的な効果も得られる場に
エンジニアライフの手助けにと始めた「グループコーチング」副次的な効果も得られる場に
2022/08/04
ポテンシャル枠限定「無限書籍購入制度」をご紹介・自発的な学びの後押しに
ポテンシャル枠限定「無限書籍購入制度」をご紹介・自発的な学びの後押しに
2022/07/28
子供の成長を最前線で見守ることができた育児休業・ポジティブなサポートに感謝「tanukiti編」
子供の成長を最前線で見守ることができた育児休業・ポジティブなサポートに感謝「tanukiti編」
2022/07/21
心身共にリフレッシュ・福利厚生で自分だけのホームジムを開設「リモートワーク補助金(年間10万円制度)を使ってみた」vol.08
心身共にリフレッシュ・福利厚生で自分だけのホームジムを開設「リモートワーク補助金(年間10万円制度)を使ってみた」vol.08
2022/07/14
一緒に働いてみたい・本音で語ってくれた面談を通して働きやすさを感じた「しくみ製作所に入社した理由〜eigoro編〜」
一緒に働いてみたい・本音で語ってくれた面談を通して働きやすさを感じた「しくみ製作所に入社した理由〜eigoro編〜」
2022/07/07
心理的安全性が高いからこそ様々なことに取組める・フルリモートでの雑談に関する試行錯誤
心理的安全性が高いからこそ様々なことに取組める・フルリモートでの雑談に関する試行錯誤
2022/06/30
3社5職種を経てエンジニアに・学びを加速させる仕組みに感謝「ポテンシャル枠奮闘記〜kawaguchi編〜」vol.01
3社5職種を経てエンジニアに・学びを加速させる仕組みに感謝「ポテンシャル枠奮闘記〜kawaguchi編〜」vol.01
2022/06/23
海外リモートワーカーの仕事環境を紹介・普段の生活にはない気持ちの変化や発想、課題の発見が「norikt編」
海外リモートワーカーの仕事環境を紹介・普段の生活にはない気持ちの変化や発想、課題の発見が「norikt編」
2022/06/16
整備された評価制度と環境が魅力・文系大学からWebエンジニアになって「ポテンシャル枠奮闘記〜seiji編〜」vol.01
整備された評価制度と環境が魅力・文系大学からWebエンジニアになって「ポテンシャル枠奮闘記〜seiji編〜」vol.01
2022/06/09
しくみ製作所の緩急のバランスが好き・家族がいつも側にいる最高の環境で「メンバーインタビュー〜Sparrow編〜」
しくみ製作所の緩急のバランスが好き・家族がいつも側にいる最高の環境で「メンバーインタビュー〜Sparrow編〜」
2022/06/02
ポテンシャル枠を支援する寺子屋やグループコーチングの取組みにより成長が加速「ポテンシャル枠奮闘記〜kinoko編〜」vol.02
ポテンシャル枠を支援する寺子屋やグループコーチングの取組みにより成長が加速「ポテンシャル枠奮闘記〜kinoko編〜」vol.02
2022/05/26
保険業界からの転職・共に働くメンバーに魅力を感じて「しくみ製作所に入社した理由〜watanabe編〜」
保険業界からの転職・共に働くメンバーに魅力を感じて「しくみ製作所に入社した理由〜watanabe編〜」
2022/05/19
新規事業の構想から開発までをサポート「つくらないプロダクト開発」をリリースしました
新規事業の構想から開発までをサポート「つくらないプロダクト開発」をリリースしました
2022/05/12
エンジニアとして大きく成長できる環境がここに「ポテンシャル枠奮闘記〜sakita編〜」vol.01
エンジニアとして大きく成長できる環境がここに「ポテンシャル枠奮闘記〜sakita編〜」vol.01
2022/04/21
オンラインイベントサービスreBakoの正式リリースから一年をふりかえって
オンラインイベントサービスreBakoの正式リリースから一年をふりかえって
2022/04/14
インドネシアから働くエンジニアが語るフルリモートでの生活と働き方
インドネシアから働くエンジニアが語るフルリモートでの生活と働き方
2022/04/07