このページの先頭です

ここからメインメニューです
メインメニューここまで

ここからページの本文です
ビジネスコラム | BUSINESS COLUMN

HOME > ビジネスコラム > 2006年09月

メイン

postgresqlにおける日本語全文検索

データベースにおいて、日本語全文検索をおこなう際、
皆さんはどのようにしていますか?
素直に登録されているデータをLIKEによる全文検索を行うと
無駄な検索時間を消費してしまいます。

postgresqlにおいて、通常キーワードを全文検索でデータにマッチさせ、表示を行うには、
SQL を使って以下の様に記述できます。

SELECT item_id FROM item WHERE item_text LIKE '%キーワード%';

このSQLの記述で、希望のデータは抽出することが出来ます。
しかし、検索するデータが増えれば、LIKE %キーワード%' の条件は、シーケンシャルスキャンが
走ってしまい、INDEX機能が効かなくなってしまいます。
1万件、2万件、10万件、100万件とデータが増えていけば、キーワードによる検索が行われる度に、
それぞれ、1万件、2万件、10万件、100万件のデータを調べる事になり、アプリケーションに多大な
負荷を与えます。
他の条件を加えて、検索件数を減らすことにより、検索速度を上げる事はできますが、
SQLで記述するには上記の方法しかありません。
検索用のインデックスを作成すれば、検索速度は格段にアップします。
しかし、新しいデータを入力する度に、インデックスを作り直していては
管理者にとって負荷になってしまいます。

インデックスを作成する負荷を減らす方法として、
日本語全文検索システムを使用する方法があります。
現在、日本語全文検索システムは多数ありますが、
世間で一般的な全文検索システムの手法は主に、
【形態素解析】、【N-gram】この二つになります。
【形態素解析】とは、文章を単語単位で区切り、インデックス(索引用データ)を作成する手法
【N-gram】とは、文章を特定の文字数で、分割を行いインデックスを作成する手法になります。
何故このような方法で、インデックスを作成するのでしょう。
それは、英語圏は、単語の区切りはスペースというルールがありますが、
日本語には、明白なルールがありません。
その為、ある一定の法則を使って、分割する必要があるのです。

代表的な二つの手法には、それぞれ長所、短所があります。
【形態素解析】
長所
・意味をもつ単語で分割するため、検索時に的確な検索が行える
・細切れなインデックスを作成しないため、インデックスのデータが少なくてすむ
短所
・辞書による、単語の分割を行うため、辞書に無い単語は、正しく分割できない
・文章の解析を行いながら、辞書を参照して、単語の分割を行うため、インデックスの作成に時間がかかる

【N-gram】
長所
・一定の文字数で文章を分割するため、検索漏れが少ない
・一定の規則で、文字分割を行う為インデックス作成が比較的早い
短所
・的確な検索が行えない為、不要なデータが検索される場合がある
・意味を持たない文字列で分割する為、インデックスのデータが多くなる

この両者の欠点を補った、検索エンジンがあります。

Rast
Hyper Estraier
Senna

postgresqlには、全文検索モジュールで、Tsearch2があります。
Tsearch2は、ヨーロッパ言語向け全文検索モジュールにです。
ヨーロッパ言語向けとはいえ、英語圏と同じように半角スペースで
区切られた単語単位でインデックスを作成するため、日本語全文検索を行うには、
日本語辞書を使い、形態素解析を行わなくてはなりません。

Tsearch2を日本語に対応する為の形態素解析関数に
pgkakasiwというものがあります。
pgkakasiwを使い、検索用インデックスを作成する事により、
Tserch2 は、全文検索を行いたい日本語の文章をtsvector型のカラムに最小の単語数でインデックスを作成します。
そのカラムに、GIST型のインデックスを設定する事により、迅速な検索が行えるようになります。
postgresqlにおいて、GIST型のインデックスを設定する際には、
7つのメゾットを提供しなくてはなりません。
しかし、tsearch2をインストールする事により、それを全て提供する手間を省いてくれます。

今回は、tsearch2のみのでしたが、postgresql用の日本語全文検索システムは、
pgRast,pgsennaなど、他の日本語全文システムもあります。
日本語全文検索システムを使用しない検索には限界があります。
日本語全文検索でカスタマイズを必要とする際は、
日本語全文検索システムを導入してみてはいかがでしょうか。



システムソリューション事業部
斎藤重隆

お問い合わせ・ご相談はお気軽に

弊社サービスへのお問い合わせ・ご相談は、「お問い合わせ・ご相談ページ」のほか、もしくは直接のお電話でも承っております。お気軽にお問い合わせください。

インターネットでのお問い合わせ

お電話でのお問い合わせ

03-3341-6598

営業時間 : 10:00~19:00(土日祝休)/担当 : 青木・原田

本文ここまで