TOP業務システム> 部分一致検索
Ludia
高性能なオープンソース全文検索システム「Ludia」

第5回:Ludiaの多彩な検索機能の秘密

著者:NTTデータ  岩崎 正剛   2007/2/13
前のページ  1  2   3  4  次のページ
部分一致検索

   ここでは部分一致検索を説明していきますが、まずは以下のような検索を実行してみてください。
# SELECT txt FROM tbl WHERE txt @@ 'こんに';
          txt
------------------------
こんにちは
こんにちは、さようなら
(2 rows)

   「こんに」が含まれる行が取得できています。これは一見当然にみえますが、今回の例で利用しているインデックスは(インデックスアクセスメソッドとしてfulltextを指定しているので)形態素解析を用いている単語インデックスです。次のようにコマンドラインでmecabコマンドを実行してみるとわかるのですが、「こんにちは」はこれで1つの単語で、それ以上細かく分解されません。

$ echo 'こんにちは' | mecab
こんにちは      感動詞,*,*,*,*,*,こんにちは,コンニチハ,コンニチワ
EOS

   したがって、単純に考えれば「こんに」を検索しても、「こんにちは」を含む行は得られないように思われます。ここで「こんに」を含む検索結果が得られてるのは、完全一致検索だけではなく、部分一致検索が行われているからです。

   つまり、全文検索インデックスに登録されている単語から、「こんに」が部分一致する単語(ここでは「こんにちは」)を探し、それを含む行を取得しています。

   この部分一致検索は常に行われるわけではありません。多くの場合、ヒット件数が多くなりすぎてしまうからです。そのため、デフォルトの設定では、検索結果が1件もなかったらさらに部分一致検索を実行して該当するものを探すようになっています。次のような検索を実行すると、検索結果には「こんにちは」という行が含まれなくなります。

# SELECT txt FROM tbl WHERE txt @@ 'こんに OR さようなら';
          txt
------------------------
さようなら
こんにちは、さようなら
(2 rows)

   この挙動は「*E」という特別な記号(プラグマ)を検索条件のはじめにつけることで、変更することができます。例えば、次のように検索条件を指定すると、ヒット件数が2件以下の場合にさらに部分一致検索を行ってヒットするものがないか探す、という動作になります。

# SELECT txt FROM tbl WHERE txt @@ '*E2 こんに OR さようなら';
          txt
------------------------
さようなら
こんにちは、さようなら
こんにちは
(3 rows)


近傍検索

   近傍検索はある単語とある単語が近くに含まれるようなデータを検索します。近傍検索を実行する場合は以下のように「*N」というプラグマを用います。

# INSERT INTO tbl VALUES ('こんにちは、こんばんは、さようなら');
INSERT 0 1

# SELECT txt FROM tbl WHERE txt @@ '*N3 "こんにちは さようなら"';
                txt
------------------------------------ こんにちは、さようなら
こんにちは、こんばんは、さようなら
(2 rows)

   上記のような「'*N3"こんにちは さようなら"'」という検索条件を指定した場合、「こんにちは さようなら」に含まれる単語(「こんにちは」と「さようなら」)が3語以内の距離に出現する行がヒットします。

   上記の結果の2行目は、「こんにちは」と「さようなら」の間に、「、」「こんばんは」「、」という3つの単語が含まれるので、距離が3です。指定する距離の値を2に変えてみると、この行はヒットしなくなります。

# SELECT txt FROM tbl WHERE txt @@ '*N2 "こんにちは さようなら"'
          txt
------------------------
こんにちは、さようなら
(1 row)


類似文書検索

   類似文書検索はあるデータと「似ている」データを検索します。類似文書検索を実行する場合には「*S」というプラグマを用います。比較元になる文書は検索条件の中の文字列として直接指定します。

# SELECT txt FROM tbl
         WHERE txt @@ '*S1 "こんにちは。こんにちは。しつこいですが、こんにちは。"';
                txt
------------------------------------
こんにちは
こんにちは、こんばんは、さようなら
こんにちは、さようなら
(3 rows)

   上記のクエリでは、「こんにちは。こんにちは。しつこいですが、こんにちは。」という文章から特徴語が1つ抽出され、それを含む行が検索されます。特徴語というのはその文章中で出現頻度が高い語です。ここでは「こんにちは」という単語が特徴語として選ばれ、それを含む行が検索結果として得られています。

前のページ  1  2   3  4  次のページ


株式会社NTTデータ 岩崎 正剛
著者プロフィール
株式会社NTTデータ  岩崎 正剛
基盤システム事業本部 オープンソース開発センタ
2002年よりNTTデータにてPCグリッドの研究開発などに従事。2006年よりOSS分野に参画し、現在はLudiaの開発、技術支援を行っている。


INDEX
第5回:Ludiaの多彩な検索機能の秘密
  Ludiaの検索機能
部分一致検索
  全文検索インデックスの構成オプション
  検索スコアの取得