検索エンジンを作る

第13回検索結果の表示

検索エンジンは検索機能以外に、どのような検索結果が表示できるかという観点もとても大事です。検索結果がわかりにくければ、どんなに検索エンジンが高度な機能を持っていても価値が半減してしまいます。組織の内部などで利用するエンタープライズサーチの分野では、検索結果をいかに直感的でわかりやすい表示にするかに鎬が削られています。今回は、FINDSPOTにどのような検索結果の表示のための機能を盛り込んだかについて解説します。

検索結果の表示

FINDSPOTでCGIベースの検索システムを作る場合には、検索エンジン側とCGIの検索クライアント側で、検索インターフェースを手分けして提供することになります。

図1 CGI検索システムのしくみ
図1 CGI検索システムのしくみ

検索エンジンと検索クライアントCGIの間は、図1のようにTCP/IPを使った独自のプロトコルを使って通信します。検索エンジンと検索クライアントCGIは同じサーバで動作させることもできますし、負荷分散のために別のサーバで動作させることも可能です。今回は、検索結果の表示のために、検索エンジンがCGIのような検索クライアントに対して、この独自プロトコルを通じてどのような機能を提供しているかについて紹介します。

検索結果の件数

何件見つかったかという情報は、まだ検索条件を変更して絞り込みが必要なのか、あるいは十分に絞り込めたのかを判断する大事な材料です。FINDSPOTの開発前にさまざまな検索エンジンを調べてみた時には、検索結果の件数を表示できない検索エンジンが意外に多いということがわかっていましたので、FINDSPOTの実装に際しては、検索結果の件数を確実に検索クライアントに返せる構造としました。

基本的には、検索クライアントが検索エンジンに対してこれまで解説してきたような検索式を投げると、検索エンジンは検索結果のヒット件数を返すというシンプルなプロトコルになっています図2⁠。

図2 検索エンジンとクライアントのやりとり(1)
図2 検索エンジンとクライアントのやりとり(1)

次に、検索クライアントは検索エンジンに対して何番目の検索結果を欲しいというリクエストを送り、この要求に対して検索エンジンは、指定された検索結果の詳細情報を返すようにしています図3⁠。

図3 検索エンジンとクライアントのやりとり(2)
図3 検索エンジンとクライアントのやりとり(2)

CGIなどでは、1ページに10件分程度の検索結果を表示するが一般的ですが、この1ページの表示用データを作るために、表示に不要な部分のデータは検索エンジンから検索クライアントに送りたくないというのが、このようなプロトコルにした大きな理由です。もし、検索結果のデータをすべて検索エンジンから検索クライアントに送るようなプロトコルだった場合には、10万件ヒットした場合には、10万件ぶんの検索結果のデータを検索エンジンから検索クライアントに送ることになり、とてもコスト高のシステムになってしまいます。

検索結果のヒット数を元にした分析

エンタープライズサーチの分野では、検索結果のヒット数だけ知りたいという特殊な用途が存在します。たとえば、特定の検索語で文書データを検索し、各セクションごとにヒット数を集計すれば、どのセクションがその検索語の分野について専門的に取り組んでいるかが予想できます。あるいは、文書の作成者ごとに検索語のヒット数を集計すれば、誰がその検索語について詳しいかという傾向をつかむことができます。

他にも、ブログを対象とした検索システムで、日ごとに特定の検索語で検索を行った結果を集計すれば、その検索語がブログで言及された日ごとの遷移をつかめます。これを数字ではなくグラフ化すれば、注目度が上がって来ているトピックなのか、下がり始めたトピックなのかといった分析もできます。

このような、検索結果のヒット数を元にした分析機能は、一部の検索エンジンですでに作り込まれた形で製品化されていますが、今後もっともっと発展していく可能性を感じます。FINDSPOTでは、今のところ、このようなヒット結果の分析機能を単品で提供するのではなく、分析機能をCGIなどでカスタマイズして開発するための手段/しくみ/材料の提供に重きを置くようにしています。

検索結果の表示内容

検索結果の表示内容は、検索クライアント側の画面デザインの主要要素となります。FINDSPOTではカスタマイズ性を重要視していますので、特定の画面デザインを前提にした構造にはしていません。

検索クライアントからの検索結果の要求に対して、書誌データの保存されたSQLデータベースのテーブルに記録してある文書プロパティ情報は、どのプロパティについても検索結果として検索クライアント側に返せるしくみにしています。

さらに、連載第10回で説明した文書フィルタの出力結果のXMLを検索エンジンのサーバ側にスプールしておき、検索クライアントの要求に応じて、XMLデータをクライアント側に返せるしくみを提供しています。こちらからは、SQLデータベースのテーブルに保存していない本文などの情報も取得できます。

このようにして、検索エンジンから取得した文書プロパティ情報や、フィルタ出力のXMLを元に検索結果の表示内容を作成できます。文書プロパティ情報は、FINDSPOTに用意されているURLやタイトルなど標準的なもの以外にも、文書フィルタを作成・カスタマイズすることで比較的自由に変更・追加を行える構造としています。

ダイジェスト

Googleの検索結果には、検索語がヒットした近傍の文書が表示されています。FINDSPOTを開発する際に、非常に重要だと感じたのが、この文書のどんな文でヒットしたのかがすぐに把握できる機能です。
FINDSPOTではこれをダイジェストと呼んでいます。

FINDSPOTではN-gramのインデックス上に文字列の出現位置情報を保持しています。検索はすべてこのインデックス情報を元に行うため、検索が終わった時点では文中の検索語の出現位置の情報が特定できています。先ほど、文書フィルタの出力結果のXMLを検索エンジンのサーバ側にスプールできることを説明しましたが、検索エンジンは、このXMLから検索語の出現位置前後の文を抜き出し、検索クライアントに返す機能を提供しています。この機能を使うと、Googleの検索結果とよく似た表示機能を持つCGIを簡単に作ることができます。

検索結果の表示順

Googleなどでは外部から参照されるページはランキングを上げるという独自のロジックで、ランキングの高いものから順に表示するシステムを構築しています。このように、検索結果の表示順をどうするかというのは検索システムにとっては使い勝手に大きく影響する要素です。

多くの検索エンジンでは、検索結果の表示順についてカスタマイズするしくみまではなかなか提供されません。そこで、FINDSPOTではもう一歩踏み込んで、さまざまな検索結果の表示順に対応できるしくみを実装しています。

最初に実装したのが、検索結果を特定の文書プロパティを元にソートして、このソート順あるいは逆順に結果を検索エンジンから検索クライアントに取り出す機能です。たとえば、文書の作成日時をキーにソートを行えば、特定の言葉が含まれる一番最近の文書、一番古い文書などをすぐに特定することができます。

次に実装したのが、1つの文書内に検索語がいくつ存在したかという個数を数え、個数の多いものから順に検索エンジンから検索クライアントに結果を送る機能です。この方法は「検索語が文中に数多く存在すること」がその検索語についてよく言及された、あるは説明された文書であるとの仮定に基づいています。

昨年、客先からの要望で実装したのが、複数の文書プロパティをキーにした検索結果のソート機能です。それまでは、文書フィルタの出力に複数のプロパティから合成されたソートキー用のプロパティを設けることで対応していましたが、もっとさまざまな表示順を動的に指定するために実装することにしました。現在のFINDSPOTは、ソート用のキーのプロパティ数については制限がなくなり、複数のキーでソートした順で検索結果を返すことができます。

おすすめ記事

記事・ニュース一覧