検索エンジンを作る

第11回文書プロパティの検索

前回は文書フィルタというしくみについて解説しました。今回は、文書フィルタによって抽出されたプロパティ情報をどのように検索するかについて説明します。

プロパティ検索式

FINDSPOTでは、通常の全文検索は次のような検索式で実現できました。

"織田信長"

また、AND条件、OR条件、NOT条件を表現する場合には、次のように論理式を用いることができました。

"織田信長" AND "豊臣秀吉"

プロパティ検索を行う場合には、全文検索の文字列を指定していた箇所で、代わりに次のような記述を行います。

[ プロパティ名 演算子 "文字列" ]

プロパティ検索の演算子の種類は次のようなものをサポートしています。

[プロパティ名 "文字列"]特定のプロパティに文字列を含む文書を検索
[プロパティ名 ^ "文字列"]特定のプロパティが指定文字列で始まる文書を検索
[プロパティ名 $ "文字列"]特定のプロパティが指定文字列で終る文書を検索
[プロパティ名 = "文字列"]特定のプロパティが指定文字列の値である文書を検索
[プロパティ名 < "文字列"]特定のプロパティが指定文字列より小さな値の文書を検索
[プロパティ名 > "文字列"]特定のプロパティが指定文字列より大きな値の文書を検索
[プロパティ名 <= "文字列"]特定のプロパティが指定文字列以下の値の文書を検索
[プロパティ名 >= "文字列"]特定のプロパティが指定文字列以上の値の文書を検索
[プロパティ名 >= "文字列1" <= "文字列2"]特定のプロパティが文字列1以上かつ文字列2以下の文書を検索
[プロパティ名 > "文字列1" < "文字列2"]特定のプロパティが文字列より大きく文字列2より小さな文書を検索

<, >, <=, >=の演算子を使ったプロパティ指定はSQLデータベースに記録した数値や日付時刻フィールドに対してのみ使用できます。演算子なし、及び^, $の演算子を使ったプロパティ指定は全文検索フィールドに対してのみ使用できます。=の演算子は、全文検索フィールド及び、SQLデータベースに記録したフィールドのどちらに対しても使用できます。

プロパティ検索式の例として、Blogのエントリを対象に全文検索を行うことを考えてみましょう。プロパティとしては、title(タイトル)、body(本文)、comment(コメント)、day(日付)と3つを定義し、title, body, commentは全文検索フィールド、dayはSQLの書誌データベースに記録するものとします。

[ title "スイーツ" ]

この検索式は、タイトルに「スイーツ」という文字列を含むBlogのエントリを検索することになります。また、

[ title "スイーツ" ] AND [ body "ロールケーキ" ]

という検索式は、タイトルに「スイーツ」という文字列を含み、本文に「ロールケーキ」という文字列を含むBlogエントリを検索します。

[ title "スイーツ" ] AND [ body "ロールケーキ" ] AND [ day <= "2008/01/01" ]

という検索式は、タイトルに「スイーツ」という文字列を含み、本文に「ロールケーキ」という文字列を含み、かつ日付が2008年1月1日以降のBlogエントリを検索することになります。

プロパティ検索式と通常の全文検索を条件式で組み合わせて使うことも可能です。

[ title "スイーツ" ] AND "チーズケーキ"

この例では、タイトルに「スイーツ」という文字列を含み、本文、タイトル、コメントのどこかに「チーズケーキ」という文字列を含むBlogエントリを検索することになります。

通常の全文検索とプロパティ検索との違いは、通常の全文検索は全文検索対象インデックスを作成しているすべてのプロパティを対象に検索を行うのに対して、プロパティ検索は、特定のプロパティに限定して全文検索を行うことができる点です。また、プロパティ検索では、SQLの書誌データベースに保存した非全文検索対象の書誌情報の数値、日時、文字列などのフィールドを対象に検索を行うこともできます。

デフォルト検索プロパティ

プロパティ検索機能は、検索対象のプロパティを特定できるので便利なのですが、あまり条件式との相性が良くありません。先のBlogエントリの検索を例に考えてみましょう。タイトルと本文のいずれかに「スイーツ」「シフォンケーキ」を含むエントリをプロパティ検索式を使って表現してみます。単純に考えると、次のような検索式になりそうです。

([ title "スイーツ" ] AND [ title "シフォンケーキ" ]) OR ([ body "スイーツ" ] AND [ body "シフォンケーキ" ])

ところが、この検索式ではtitleに"スイーツ"を含み、bodyに"シフォンケーキ"を含む文書は検索結果に含まれません。完全な検索式は次のようになります。

([ title "スイーツ" ] AND [ title "シフォンケーキ" ]) OR ([ body "スイーツ" ] AND
 [ body "シフォンケーキ" ]) OR ([ title "スイーツ" ] AND [ body "シフォンケーキ" ]) OR
 ([ body "スイーツ" ] AND [ title "シフォンケーキ" ])

単純な目的の検索なのに検索式がずいぶんと複雑になってしまいました。この欠点を補うために導入したのが、全文検索を行う際にあらかじめどのプロパティを対象に検索を行うかを指定できる、デフォルト検索プロパティと呼ぶ機能です。

デフォルトプロパティ指定は、オプションとして指定します。指定しない場合には、基本検索式の中のプロパティ指定式以外で指定される文字列は、全ての全文検索プロパティから検索されます。デフォルトプロパティ指定は次のような指定を検索式に前置します。

PROPS プロパティ名

複数のプロパティをデフォルトの全文検索対象として指定するには、プロパティ名をカンマ(,)で区切って列挙します。

PROPS プロパティ名1, プロパティ名2, プロパティ名3

プロパティには全文検索対象のフィールドのみが指定可能です。指定できるプロパティ名の数の上限はありません。

先のタイトルと本文のいずれかに「スイーツ」「シフォンケーキ」を含むエントリを探す式は次のようになります。

PROPS title, body "スイーツ" AND "シフォンケーキ"

前述の例と比べて、検索式が劇的に単純化され使いやすくなりました。実際には、使いやすくなっただけではなく、検索性能もPROPSを用いる方が4倍ほど高速に検索が行なえます。プロパティ検索式と、デフォルト検索プロパティを併用することもできるので、複雑な条件をシンプルに記述できます。

デフォルト検索プロパティは、さらに次回解説予定のADJという近傍検索機能とも併用できます。例えば、次のような検索式です。

PROPS title, body "福田" ADJ<10> "首相"

この検索式は、titleとbodyのプロパティのいずれかに、"福田"の後ろ10文字以内に"首相"を含む文書を検索します(この場合「福田首相」⁠福田 首相」⁠福田康夫首相」⁠福田 康夫首相」⁠福田 康夫 首相」などが検索できます⁠⁠。こちらの例は、プロパティ検索式では検索式を表現できません。

おすすめ記事

記事・ニュース一覧