ゼロから検索エンジニアになるまで
はじめに
こんにちは @togatogaです。検索とRustが好きです。
仕事として検索を始めて約1年半が経ちました。僕が情報検索を学び始めた当初は、どのように勉強すればいいのか分からず、手探りでさまざまな本や記事を読み漁りました。最近は周りから「どうやって検索を学んできたのか?」と聞かれることが増えたので、僕が特に役立った本や記事を紹介します。
本記事はただのソフトウェアエンジニアが検索エンジニアになるまでのリスペクト記事です。
事前準備
ChatGPTやPerplexityを活用して質問・要約・翻訳を行いましょう。安くはありませんが、24時間いつでも相談でき、英語の記事を日本語に翻訳・要約できるので非常に助かっています。本はPDF形式で購入し、ChatGPT/Perplexityに取り込んで質問や解説をさせていました。
基礎
検索技術を学びたいものの、どこから始めればいいか分からない方には、まず以下の資料がおすすめです。
検索システム 実務者のための開発改善ガイドブック
検索や検索エンジンの基礎を学ぶ最初の一冊として最適です。検索の基本である転置インデックス(ターム辞書&ポスティングリスト)、tf-idf、適合率や再現率などを学ぶことができます。
特にterm
やstop word
といった用語はElasticsearchでもよく使われるため、あらかじめどういう概念かを理解しておくと良いでしょう。アルゴリズムやデータ構造が好きな人は、ポスティングリストのデータ構造や走査アルゴリズム、MaxScore
なども面白いのでおすすめです。
後半はより実務寄りの内容になっています。まずは第一部だけ読むのがおすすめです。
OpenSearchで始める全文検索
検索の基礎を中心にn-gramや形態素解析、Analyzer/Character filter/Tokenizer/Token filtersなど、検索やElasticsearch/OpenSearchに不慣れだと分かりにくい用語を丁寧に説明してくれます。実務ですぐに使える知識を学ぶのに最適な資料です。
また動画もありますので、OpenSearchで始める全文検索【とらのあなラボTech Conference Vol.2】も参考にしてください。
Elasticsearchで日本語の全文検索の機能を実装する
Elasticsearchの公式ブログで、日本語の全文検索を実装する方法を紹介した記事です。英語検索との違いにも触れられており、「なぜ日本語ではn-gramと形態素解析の両方が必要なのか」が分かりやすく解説されています。ハンズオン形式で小さいデータを登録し、Elasticsearchのクエリを書いて試せるので、手を動かして学びたい方におすすめです。
検索はまず、Elasticsearchをローカル環境で動かして遊び倒すのが一番です。特に日本語検索はハマりどころが多いので、まずは自分で触ってみるのを推奨します。
僕はDockerでElasticsearchをローカルで動かし、KibanaのWeb Console上でさまざまなクエリを試していました。Web Console上ではElasticsearchのクエリ補完も効くので、まずはWeb Consoleを活用してクエリを書くことをおすすめします。
実践
基礎を学んだあとは、実際のシステムで検索機能を改善・開発するうえで役立った記事を紹介します。
10Xの検索を10xしたい パートII
検索に関する記事を読み漁っているときに、10Xさんのブログにたどり着きました。それぞれの施策・改善によって実際にどの指標が改善したかが示されており、検索改善に取り組む最初の一歩として大いに参考になります。また、検索メトリクスの話や関連する紹介記事も勉強になりました。
横断検索で社内情報共有を加速させる
マスターのデータソースをどのようなアーキテクチャでElasticsearchにインデックスするか、「タイトル」「本文」など複数のフィールドをまとめて検索する方法や検索スコアの設計などが学べます(例:multi_match
やtie_breaker
)。
Go言語でつくるインタプリタ
プログラミング言語を作る内容の本ですが、検索クエリパーサーを作る際にパーサーの実装や構文解析のパートが役に立ちました。
Elasticsearch/Lucene
Elasticsearchは有名な検索エンジンですが、クエリの書き方に独特のクセがあったり、スコアリングの計算が複雑だったりと、ハマりどころがたくさんあります。Elasticsearchを理解するうえで役立った資料を以下に挙げます。
なお、一部はElasticsearchではなくLuceneについて書かれた資料です。まずはElasticsearchを触り、もっと深く知りたくなったらLuceneの勉強を進めるのが良いでしょう。
Elasticsearch Guide
Elasticsearchの公式ドキュメントは最強です。クエリの書き方やスコア計算の仕組みなどを理解しつつ読み進めました。
Elasticsearch自体が複雑(例:条件によってshould
の挙動が変わるなど)で、日本語検索特有の罠(例:match
クエリでのoperator
)も多いため、ドキュメントを参照しながら実際にクエリを作って試してみるとよいでしょう。match
,must
,should
,filter
などの細かい挙動はドキュメントをしっかり読みながら理解しました。
Elasticsearch: The Definitive Guide
この本(オンラインドキュメント)を読むことで、Elasticsearchの内部構造を非常に深く理解できました。情報はやや古いですが、コアなエッセンスが凝縮されており、正直公式ドキュメントより先に読んでもいいくらいです。
特にLife Inside a ClusterやInside a Shardの章は面白く、Elasticsearchの分散システムとしての側面やLuceneとの関係性を理解できます。「ElasticsearchはLuceneを使っているらしい」程度の認識でしたが、このドキュメントをきっかけにLuceneに興味が湧きました。
Lucene in Action, Second Edition
2010年出版で、紹介されているコードはLucene 3.0ですが、Lucene 10.0用にコードを書き換えながら読み進めました。Lucene 3.0の多くのAPIが廃止されており書き換え作業は苦労しましたが、Luceneの根本的な部分は変わっていないように感じます。古い本ですが、Luceneを実際に動かしながら学ぶには今でも非常に価値があります。
この本を通じて「Luceneがどのようにデータ(e.g. segment
)を保存し、検索を実行しているか」を理解できるようになり、KibanaのSearch Profilerの出力を読み解けるようになったのも大きな収穫です。
形態素解析
日本語検索では形態素解析は切っても切り離せない存在ですが、検索機能を作るだけなら必ずしも学ばなくても大丈夫です。
形態素解析を初めて触ったときはまるで魔法のように感じましたが、検索を通じて形態素解析の仕組みそのものを知りたいと思い、勉強することにしました。仕組みを理解しておくと、検索周りの細かいトラブルに対処しやすくなります。また、形態素解析に関連するアルゴリズムやデータ構造そのものが面白いです。
形態素解析の理論と実装
形態素解析器MeCabの作者である@taku910さんによる形態素解析の解説書です。形態素解析の歴史や仕組みを知りたい方におすすめ。形態素解析のコアとなる「形態素解析辞書」の詳細や「ダブル配列&Lattice&Viterbiアルゴリズム」についてC++の実装レベルで解説されています。
形態素解析辞書の連接ID(左連接ID、右連接ID)、連接コスト、生起コストがどのように使われているかを理解することができました。
実際に形態素解析器を自作してみたくなり、Goで書かれた形態素解析器kagomeを参考に、Rustでkanpyoを実装しました。自作することで形態素解析のアルゴリズムや辞書への理解が深まり、特に未知語対応の処理は非常に勉強になりました。
以下の資料を読むと理解がさらに深まると思います。
- MeCab 汎用日本語形態素解析エンジン
- MeCab: Yet Another Part-of-Speech and Morphological Analyzer
- 日本語形態素解析の裏側を覗く!MeCabはどのように形態素解析しているか
- 情報系修士にもわかるダブル配列
白金鉱業.FM / 特別ゲスト@soramiさん(前編:形態素解析器Sudachiについて)
形態素解析器Sudachiの開発者である@soramiさんがゲスト出演し、Sudachiの魅力や辞書について解説しています。このポッドキャストをきっかけにSudachiに興味を持ち、関連する記事やブログを読み漁りました。
@soramiさんによるSudachiの解説記事はこちら。Sudachiの概要や既存の形態素解析器との比較がまとめられています。
- Elasticsearchのための新しい形態素解析器「Sudachi」
- Sudachi❤︎Elasticsearch - Speaker Deck
- Sudachi同義語辞書をElasticsearchで使う(暫定方法)
Elasticsearchを使った医療情報検索と精度改善の取り組み
KuromojiからSudachiへの移行が紹介されており、Sudachiを組み込むことでどのような改善ができるのかを知ることができます。また、Sudachiの複数のモードを組み合わせて検索ランキングを向上させるテクニックはとても参考になりました。
動画なので、記事で読みたい方は検索基盤チームのElasticsearch×Sudachi移行戦略と実践を参照してください。
発展
検索エンジニアとして機械学習やマニアックな知識を深めたい場合、以下の資料もおすすめです。(全部読めてなく、僕自身もまだまだ勉強中です)
Query Understanding for Search Engines
著名な検索エンジニアの方々が輪読会で使用していると聞き、購入して読み始めました。まだQuery Auto Completeの章と序章くらいしか読めていませんが、ランキングの作り方や評価方法が解説されていて面白いです。
AIcia Solid Project
形態素解析をきっかけに自然言語処理や機械学習に興味を持ち、数学や機械学習の基礎を学ぶためにAIcia Solid Projectの動画を見ながら、手元で数式や図を写経しつつ進めています。本当はBERT
やtransformer
を理解したいのですが、LSTM
やRNN
あたりでつまずき中です。
検索関連なら、スコアリング計算の動画がおすすめです。数式の「お気持ち」を理解することが重要だと思います。
Elasticsearch Labs
Elasticsearch Labsのブログはベクトル検索やLuceneなど、やや発展的な内容を扱っています。マニアックな話を知りたい人には非常におすすめです。僕は1か月くらい、毎日1時間使ってこのブログの記事(特にLucene
のタグが付いたやつ)を読んでいました。
情報収集
検索は日々進化している分野なので、最新情報をキャッチアップすることが重要です。以下の情報源をチェックしてみてください。
技術ブログ
他社の技術ブログを読むとリアルな課題を知ることができるので、普段から目を通しておくのが良いと思います。特に検索システムは運用が大変なので、他社の運用事例などを参考にすると良いでしょう。
検索技術勉強会
不定期(約3か月に一度)で開催される「検索」「検索システム」に関する勉強会です。発表内容は各社の検索事例から検索エンジンの内部構造まで幅広く、懇親会などでさまざまな方と交流できるので、リアルな情報交換の場としてもおすすめです。
さいごに
以上が、僕が検索エンジニアになるまでに参考にした資料です。思い出補正も含みますが、どれも基礎知識や実践的な内容が詰まっており、検索エンジニアとして力をつけることができると思います。
情報検索はアルゴリズムやデータ構造、分散システム、機械学習など、さまざまな技術が絡み合う分野であり、学びがいのある非常に面白い領域です。この記事を参考に学習を進めていただき、情報検索の面白さを感じてもらえたら幸いです。
Discussion