検索エンジンを作る

第12回 近接検索機能

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

このようにしてできあがったのが,表1に示した近接演算子の仕様です。

表1 近接演算子の仕様

検索式意味
"A" ADJ "B" A,Bの順で文字列が出現し,その距離がデフォルト値以下である文書を検索
"A" ADJ<n> "B" A,Bの順で文字列が出現し,その距離がn字値以下である文書を検索
"A" ADJ<n, m> "B" A,Bの順で文字列が出現し,その距離がn字以上m字以下である文書を検索
"A" ADJEQ<n> "B" A,Bの順で文字列が出現し,その距離がn字である文書を検索
"A" ADJNE<n> "B" A,Bの順で文字列が出現し,その距離がn字でない文書を検索
"A" ADJLT<n> "B" A,Bの順で文字列が出現し,その距離がn字より小さい文書を検索
"A" ADJLE<n> "B" A,Bの順で文字列が出現し,その距離がn字以下の文書を検索
"A" ADJGT<n> "B" A,Bの順で文字列が出現し,その距離がn字より大きい文書を検索
"A" ADJGE<n> "B" A,Bの順で文字列が出現し,その距離がn字以上の文書を検索
"A" NEAR "B" 順序を問わずA,Bの文字列が出現し,その距離がデフォルト値以下である文書を検索
"A" NEAR<n> "B" 順序を問わずA,Bの文字列が出現し,その距離がn字値以下である文書を検索
"A" NEAR<n, m> "B" 順序を問わずA,Bの文字列が出現し,その距離がn字以上m字以下である文書を検索
"A" NEAREQ<n> "B" 順序を問わずA,Bの文字列が出現し,その距離がn字である文書を検索
"A" NEARNE<n> "B" 順序を問わずA,Bの文字列が出現し,その距離がn字でない文書を検索
"A" NEARLT<n> "B" 順序を問わずA,Bの文字列が出現し,その距離がn字より小さい文書を検索
"A" NEARLE<n> "B" 順序を問わずA,Bの文字列が出現し,その距離がn字以下の文書を検索
"A" NEARGT<n> "B" 順序を問わずA,Bの文字列が出現し,その距離がn字より大きい文書を検索
"A" NEARGE<n> "B" 順序を問わずA,Bの文字列が出現し,その距離がn字以上の文書を検索

"文字列"は全文検索対象のフィールドのいずれかに文字列の値が含まれることを示し,n, mには整数値を指定します。ADJという演算子が出てきますが,これはADJACENTという英単語(近接した,直前のという意)の略です。

ADJは左右の語は指定された順に現れるという条件で,NEARは順不同という違いがあります。また,近接演算子を次のように,1つの検索式で複数回用いることもできます。

"A" ADJ "B" ADJ "C" ADJ "D"

この場合は,"A"の後に"B",その後に"C",その後に"D"という文字列が現れるという条件での検索となります。

近接演算子の左右には文字列,もしくは近接演算子で構成される()のブロックしか記述できません。つまり,次のような検索式は記述できません。

"A" ADJ ( "B" AND "C" )

近接演算子による検索式の例

では,実際の近接演算子による検索式を見ていきましょう。

「福田首相」⁠福田 首相」⁠福田康夫首相」⁠福田 康夫首相」⁠福田 康夫 首相」といったバリエーションに全て合致するような近接検索は,4文字以内に"福田"と"首相"の文字列が順に存在すれば良いので次のようになります。

"福田" ADJ<4> "首相"

このように,人名を検索する場合などに近接演算子は力を発揮します。ほかにも製品名,病名,化学物質名などの検索にも訳に立ちそうです。

"福田"と"首相"の文字列が近接しているという条件に加え,文中に「靖国神社参拝」を含む記事を探す場合にはつぎのように括弧が必要です。

( "福田" ADJ<4> "首相" ) AND 靖国神社参拝

括弧がないと,パーサの構造上

"福田" ADJ<4> ( "首相" AND 靖国神社参拝 )

として指定されたことになり,近接演算子の左右には文字列もしくは,近接演算子で構成される()のブロックしか記述できないという制約にひっかかってしまいます。

著者プロフィール

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

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

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

著書

コメント

コメントの記入