検索エンジンの作り方

elastic-de-142343-blogheader.V1_V1.jpg

検索エンジンは、私たちが生活していくうえで当たり前の存在になっています。何かを調べようと思ったときには、検索エンジンに単語やフレーズを入力するだけで、たくさんの検索結果が表示されます。まるで魔法のようですが、近頃はさほどの驚きを感じない方もいるかもしれません。検索という行為が、私たちにとってすっかり日常になってしまったからです。しかし、AltaVistaが隆盛だった当時を覚えている方であれば、検索エンジンの性能が現在どれほど良くなっているかを実感しているに違いありません。

「検索エンジン」と言った場合、GoogleのようなWeb検索エンジンを思い浮かべる方が多いのではないでしょうか(Bingが浮かんだ人はそれより少ないと思いますが、Bingでもかまいません)。しかし、検索エンジンの用途はWebを検索するだけにとどまりません。たとえば、今人気のUberやTinderなどのアプリには、強力な検索エンジンが搭載されており、地理的位置などの情報を使って、それぞれのプラットフォームの内部だけに絞ってユーザーがドライバーやデートの相手を見つけられるようになっています。各種のストリーミングアプリ、学術系サイト、さらにはイントラネットでも、これと同じことをしています。もっと言えば、規模の大きなWebサイトでは多くの場合、ナビゲーションバーに検索バーがあり、訪問者がそのサイトで探している情報を見つけられるようになっているものです。

検索エンジンに考えられるユースケースは膨大な数にのぼります。そして、それこそが皆様がこの記事をお読みになっている理由ではないでしょうか。皆様は、初めて検索エンジンを作ろうとしている開発者の方かもしれません。あるいは、検索拡張生成で生成AIを強化できることに気がついており、さらに詳しい情報を知りたいと思っている方かもしれません。そこで、できるだけ話をわかりやすくするために、この記事は3つのセクションに分けてあります。

  • 検索エンジンの定義とコンセプト

  • 独自の検索エンジンの作成

  • Elastic®で検索エンジン開発が簡単になることについて

この記事を最後までお読みになる頃には、Webサーバー、データインジェスト、インデックス、およびElasticの検索プラットフォームを使って初めての検索エンジンを開発するうえで必要な知識がすべて揃います。

検索エンジンの定義とコンセプト

ためしに、検索エンジンを図書館の司書であると考えてみましょう。司書は、利用者が探している情報を見つける手伝いをしてくれる存在です。解決したい問題や、答えを探している問題を伝えれば、それに応じて最も役に立つと思われる本や資料を案内してくれるというわけです。案内してくれる本や資料が必ずしも当を得ているわけではありませんが、運良くぴったりの本に巡り会うことを期待してやみくもに本を開いて回るよりはずっと効率的です。

検索エンジンを構成する要素としては主に、Webサーバー、データインジェスト、インデックス、結果ページの4つがあります。検索エンジンを作る前に、それぞれがどのような役割を果たしているかを把握しておきましょう。

Webサーバー

検索エンジンが図書館の司書だとすると、Webサーバーは図書館そのものです。ユーザーに対して有意義な結果を返すために必要なデータのすべてが、ここに格納されます。Webサーバーは通常、スケーラビリティ、アクセス性、セキュリティ、パフォーマンスの観点から、クラウドベースのものが使われます。Web検索エンジンの場合、WebサーバーにはHTMLページ、画像、動画など、さまざまなWebサイトで利用するアセットが置かれます。また、SNSサイトの場合には、タイトル、ディスクリプション、メタデータなど、そのプラットフォームのコンテンツに必要な情報が置かれます。

データインジェスト

図書館がさまざまな本を収集する必要があるように、検索エンジンも何らかの場所からデータを集めてくる必要があります。これが、検索エンジンを作るうえでデータインジェストが重要になる理由です。Web検索エンジンの場合にデータインジェストに使われるのは、Webクローラーです。Webクローラーは高度なアルゴリズムを使ってWebサイトをスキャンし、各サイトのコンテンツやそこにある情報を特定することができます。

APIを介して他のサービスと統合するのも、一種のデータインジェストです。APIを介して他のサービスと統合すると、データをどこから取得するかを選べるようになるため、検索エンジンが特定のデータを見つける精度が大幅に高まります。たとえば、動画の検索エンジンを作るのであれば、YouTube、Netflix、Disney+などのプロバイダーの動画が結果に表示されるようにすることが考えられます。

同じように、コネクターでも、各種のデータソースから情報を取得できます。コネクターは多くの場合、特定のデータベース、アプリケーション、またはAPIに接続できるように事前に構築されたモジュールやコードスニペットです。コネクターを使えば、手を広げすぎることなく大きな柔軟性が得られます。

インデックス

図書館と同じく、検索エンジンでもコンテンツをインデックスする必要があります。インデックスがなければ、何がどこにあるかがわからなくなるからです。インデックスは、データソースから得た情報を整理して格納し、効率良く取得できるようにする役割を担います。検索エンジンが効果を発揮するためには、コンテンツの特定、順位付け、提供をすばやく処理できる必要があります。

インデックスするデータは膨大な量になる可能性が高いため、単にソースからインデックスをそのままコピーするわけにはいきません。そこで、インデックスでは、コンテンツを処理したうえで、次のような主要素に分解する必要があります。

  • キーワード:そのページで見つかる単語やフレーズ

  • 埋め込みテキストデータを表す多次元ベクトル

  • メタデータ:タイトル、ディスクリプションなど、ページに埋め込まれている構造化データ

  • コンテンツ分析:ページのトピック、エンティティ、全体としての意味

  • バックリンク:他のWebサイトからそのコンテンツを参照しているリンク

検索エンジンの結果ページ(SERP)

パズルの最後のピースが、実際にユーザーに検索結果を表示することです。検索エンジンの結果ページは、サーバー、データインジェスト、インデックスに関するこれまでの作業のすべてを受けて、検索結果をユーザーにとって使いやすい形の一覧にまとめたものです。

SERPの見た目は検索エンジンごとに違いますが、タイトル、リンク、ディスクリプションが表示されるほか、何らかの形のページネーションを設けてあるのが一般的です。このほか、頻繁に使うパラメーターを基に検索結果を絞り込めるように、さらに高度なフィルタリングとファセットの機能を用意することもあります。しかし、重要なのは、検索結果が明確に表示され、ユーザーにとって最善かつ最も関連性の高い選択肢が見つけやすくなっていることです。

重要なのは、検索関連性です。検索関連性が高ければ、ユーザーに意図をわかっていることを示し、正しい道に進めているという安心感を与えられるため、信頼性が高まるからです。究極的には検索関連性こそが、ユーザーを必要な情報にシームレスに導くものです。そして、ユーザーを必要な情報に導くことができれば、それがひいては、ロイヤルティの向上や、長期にわたるエンゲージメントにつながっていきます。

Elasticで独自の検索エンジンを開発する

検索エンジンの主な要素について理解が深まったところで、今度は検索エンジンを開発するプロセスと、その際に直面する可能性が考えられる問題を見ていきましょう。

まずは、検索エンジンのスケールを検討する必要があります。とにかく優れたものを作りたい、新たなGoogleを目指したいという誘惑に駆られるかもしれませんが、数十億ものWebページをクローリングするには、インフラも演算能力も膨大な量が必要になります。データを格納するための容量については言うまでもありません。

また、開発を始めるにあたっては、自分が現在持っている知識とスキルセットを念頭に置くことも必要です。データソースをよく理解しているほど、開発する検索エンジンにそのソースを活用しやすくなるものです。それと同じく、できるだけ自分が経験済みの技術スタックを活用するようにしましょう。Pythonが得意なら、検索エンジンの開発にもPythonを使うことを検討してください。

手順1:検索の要件を決める

検索エンジン開発の第一歩が、検索エンジンでどんな問題を解決するかを決めることです。この決定は、データソースからインデックス、結果の表示方法に至るまで、今後開発するあらゆる要素に影響を及ぼします。そのため、検索エンジンの想定ユーザーを検討するとともに、以下の質問について自分なりの答えを考えておく必要があります。

  • ユーザーはなぜこの情報/コンテンツを探しているのか?

  • 関連性が高いと判断するうえで必要な情報は何か?

  • ある結果が他の結果よりも良いと判断する方法をどうするか?

  • 検索結果をできるだけ使いやすくするには、結果をどのように表示すれば良いか?

ここに挙げた質問について答えが固まれば、どのデータソースを使うか、検索エンジンの結果ページに画像を入れるかどうかなど、開発プロセス全体を通じて下す重要な決断の精度が大きく高まるはずです。頭の中にある答えが明確であればあるほど、ユーザーのニーズと期待に応えられる可能性も高くなります。

手順2:Webをクローリングしてデータを集める

検索エンジンの要件が決まったら、次は必要なデータを取り込む作業です。統合機能やコネクターを使用する予定の場合には、対応するデータソースに対するアクセス権を取得したうえで、インデックスする際に必要なタイミングでいつでもそのデータにアクセスできるようにする必要があります。データソースが自分のものであれば、この点が問題になることはありません。これに対して、外部のデータソースの場合には、常にある程度のリスクが付きまとうことを忘れないようにしましょう。データソースの所有者がアクセス権を取り消したり、データを変更したりする事態が起こると、それが原因となって将来的に問題が発生するおそれがあります。この点は、データの更新スケジュールを設定することにより対応できることもありますが、データの構造やアーキテクチャーに変更があった場合には、依然として問題が起こる可能性が残ります。

Web検索エンジンを開発する場合には、インデックスするデータの収集にWebクローラーを使用します。この処理にかかる時間は、開発する検索エンジンが対象とする範囲によって変わります。クローラーは、理屈の上では自分で作ることも可能です。ただ、それには膨大な労力が必要になるので、Elastic Webクローラーのような既存のツールを活用しましょう。その方が、時間も苦労も格段に少なくできます。Elastic Webクローラーなら、好きなWebサイトをどれでもスキャンできるほか、スケジュールを設定して再クローリングを自動で実行することもできるので、検索エンジンを常に最新の状態に保てます。

手順3:収集した情報を格納する

クローラー、API、コネクターのうち、どれを使っているかは問題ではありません。いずれにしても、収集した情報をどこかに格納しておく必要があります。もっとも、深く考えずに従来型のデータベースに飛びつくようなことは避けましょう。データの量や増大幅、パフォーマンス要件、データ構造、スケーラビリティ、信頼性、セキュリティ、分析などの要素を考慮する必要があります。このほか、データの格納にかかるコストを短期、長期の両面から検討することも必要です。

既に書いたとおり、ご自身のスキルセットを考慮に入れることも有用です。たとえば、これまでの開発のほとんどにElasticsearch®を使っていたのであれば、今はそれが最善の選択肢になるでしょう。しかし、何か別種のデータベースに慣れているのであれば、上に挙げた要素を基に判断していく必要があります。

手順4:ページをインデックスする

次は、収集と格納を済ませたデータをインデックスする作業です。ユーザーのクエリに対して最も関連性の高い結果を返すためには、この作業が欠かせません。幸い、Elastic Webクローラーなら、インデックスの機能が含まれているので、簡単に終わります。もっとも、インデックス構造を設定するにあたり、データの粒度、属性インデックス、データ圧縮などの要素を検討することは依然として必要です。

この段階では、ある程度の試行錯誤が必要になると思われます。その試行錯誤をどのように進めていくにしても、ユーザーの以下のような活動に役立つかどうかは常に意識するようにしてください。

  • 関連性の高い情報のすばやい特定

  • 検索の絞り込み、結果のフィルタリング

  • 関連コンテンツの発見

なお、すぐに使える検索UIを活用すれば、短期間で検索エンジンのUIを立ち上げることができるので、一連の作業の難易度が大幅に下がります。こちらは、検索エンジンのテストからインデックスのレビュー、検索エンジン改良のための微調整や変更まで、さまざまな作業に対応できます。また、フィルタリング、並べ替え、ページネーション、逐次検索なども用意されています。

手順5:検索結果を最適化する

どんな検索エンジンを開発する場合でも、究極的な目標は、ユーザーに最も有用で関連性の高い結果を届けることです。しかし、この目標を最初から達成できる可能性は高くないでしょう。そのため、検索エンジンに絶えず改良を加え、目標に少しずつ近づいていく姿勢が必要になります。キーワードマッチング、ベクトルデータベース、ハイブリッド検索の各種手法、関連性スコアリング、リンク分析、同義語などはいずれも、大きな改善につながる可能性を秘めています。

このほか、検索性能の向上に向けて機械学習やAIの利用に目を向けてみるのも効果的です。機械学習やAIを使えば、検索エンジンの性能を格段に高めることができます。検索エンジンがユーザーの振る舞いから学習し、高度なパーソナライゼーションを施せるようになるからです。ユーザーの意図やトーンを深く理解することまで可能になることもあります。もっとも、機械学習やAIを利用する場合には、それに付随する課題にも対処が必要になります。検索エンジンにバイアスが入り込まないようにしたり、プライバシーとセキュリティに関する対策を真剣に考えたりしなければなりません。

検索エンジンの開発を簡単に

初めての検索エンジン開発を大変な作業であると感じている方もいらっしゃるかもしれません。ここで紹介した手順をお読みになって、実際に自分にもできると思っていただけたのであれば幸いです。また、Elasticは、一連のプロセスの手順の1つひとつで皆様をサポートします。具体的には、データインジェストをシンプルに進めるためのWebクローラーなどのツール、インデックスに便利なスケーラブルで柔軟なアーキテクチャー、関連性を高める機械学習機能をご用意しています。

Webサイト検索を開発するにしろ、何かに特化した検索エンジンを開発するにしろ、Elasticsearchなら効率的でユーザーフレンドリーな検索エクスペリエンスをゼロから作り上げるために必要なツールが揃っています。

次にやるべきこと

準備ができたら、ビジネスに優れた検索エクスペリエンスをもたらすための次の4つのステップに進みましょう。

  1. 無料トライアルを開始して、Elasticがビジネスにどのように役立つのかを実感してください。

  2. ソリューションのツアーで、Elasticsearchプラットフォームの仕組みと、ソリューションがニーズにフィットする仕組みを確認してください。

  3. 45分間のウェビナーで、Elasticsearchクラスターのセットアップ方法とデータの収集とインジェストを開始する方法を学習しましょう。

  4. 興味を持ってくれそうな人とこの記事を共有してください。メール、LinkedIn、Twitter、Facebookで共有しましょう。

本記事に記述されているあらゆる機能ないし性能のリリースおよびタイミングは、Elasticの単独裁量に委ねられます。現時点で提供されていないあらゆる機能ないし性能は、すみやかに提供されない可能性、または一切の提供が行われない可能性があります。

このブログ記事では、それぞれのオーナーが所有・運用するサードパーティの生成AIツールを使用したり、参照したりしている可能性があります。Elasticはこれらのサードパーティのツールについていかなる権限も持たず、これらのコンテンツ、運用、使用、またはこれらのツールの使用により生じた損失や損害について、一切の責任も義務も負いません。個人情報または秘密/機密情報についてAIツールを使用する場合は、十分に注意してください。提供したあらゆるデータはAIの訓練やその他の目的に使用される可能性があります。提供した情報の安全や秘密が守られる保証はありません。生成AIツールを使用する前に、プライバシー取り扱い方針や利用条件を十分に理解しておく必要があります。

Elastic、Elasticsearch、ESRE、Elasticsearch Relevance Engine、および関連するマークは、米国およびその他の国におけるElasticsearch N.V.の商標、ロゴ、または登録商標です。他のすべての会社名および製品名は、各所有者の商標、ロゴ、登録商標です。