検索エンジンを作る

第8回 検索と論理式

この記事を読むのに必要な時間:およそ 2 分

これまでFINDSPOTのN-gramによる検索機能のしくみについて解説してきました。今回から検索式というテーマに移ります。

検索式のコンセプト

検索式とは,検索エンジンに対して全文検索の問い合わせを行うための問い合わせ文です。SQLであればselect文に相当するものと考えてください。検索エンジンの検索式はSQLのように標準的なものがないため,それぞれの検索エンジンに固有の検索式の形式があります。FINDSPOTでも独自の検索式を用いています。

FINDSPOTの検索式を設計する上で考慮したのは,なるべくシンプルに検索要求が表現できるという点です。また,検索式を解析するパーサが高速に処理できるようにというのも特に考慮した点です。検索式の構文は,エンドユーザが検索エンジンに触れる入り口ともいえます。半角文字,全角文字をあまり区別せず使えた方が,利用者の負担は少なくなります。後述する検索式の予約語である,空白文字,"(ダブルクオート), AND, NOT, ORなどは半角文字だけではなく,全角文字でも処理できるようにするといった工夫も施しています。

では,検索機能の紹介を兼ねながら,FINDSPOTの検索式とその実現方法について説明していきましょう。

文字列

文字列検索は,全文検索エンジンにとっては何と言っても一番の柱です。FINDSPOTで文字列を検索するには,検索エンジンに対して,単に文字列を指定します。文字列に空白文字を含んでいる場合や,後述する演算子などの予約語を文字列として検索するには"(ダブルクオート)で囲みます。ダブルクオートを文字列中に含める場合には,\"のように\(バックスラッシュ)を前につけます。また,バックスラッシュを文字列中に入れる場合には\\のようにします。

例:
織田信長
"織田 信長"

文字列検索は,これまでに解説してきたようにN-gramの方式を用いて実現しています。

AND条件

全文検索では,単一の文字列だけではなかなか目的の情報に辿り着けません。そこで複数の文字列を指定して,それらの文字列を全て含む文書を検索することが多いことと思います。FINDSPOTで複数の文字列をすべて含む文書を探す場合には,空白記号で区切って文字列を複数指定します。

例:
織田信長 豊臣秀吉
織田信長 豊臣秀吉 徳川家康

この時,文字列を区切った空白記号は論理的にとらえると論理積の条件を指定したことになります。FINDSPOTでは,論理積の条件をANDという演算子を用いて明示することもできます。上記の例でANDの演算子を明示すると次のようになります。

例:
織田信長 AND 豊臣秀吉
織田信長 AND 豊臣秀吉 AND 徳川家康

FINDSPOTでは空白記号は暗黙にANDの演算子を指定したものとして扱っていますので,AND演算子を指定した場合も,省略した場合も検索結果は同じになります。

では,ANDの左右に指定された文字列を両方含む結果を得るには,どのようにしたら良いでしょうか。FINDSPOTでは検索結果を文書集合として扱っています。AND条件はこの文書集合どうしの論理積の集合演算として実現しています。

たとえば「織田信長 AND 豊臣秀吉」という検索式を考えてみましょう。まず,「織田信長」という文字列を検索して検索結果である文書集合を得ます。次に,「豊臣秀吉」という文字列を検索して検索結果である文書集合を得ます。そして,2つの文書集合どうしを比較して,両方に存在する文書を探して,結果である文書集合を求めます。これが,FINDSPOTでのAND演算子の実現方法です。

「織田信長 AND 豊臣秀吉 AND 徳川家康」のようにAND条件が複数指定された場合には,始めに「豊臣秀吉 AND 徳川家康」の答えである文書集合を求めて,次に織田信長の検索結果の文書集合との間で,再度ANDの集合演算を行います。

著者プロフィール

工藤智行(くどうともゆき)

有限会社サイパック取締役社長。システム構築・管理のコンサルティング,ローカライゼーション,文書処理や障害者向けソフトウェアを中心とするプログラミングを長年手がける。 近著『UNIXプログラミングの道具箱』『システム管理現場の鉄則FreeBSD編』等

URLhttp://www.cypac.co.jp/

著書

コメント

コメントの記入