SQLで全文検索

ここしばらくSQLRDBMS(リレーショナルデータベース管理システム)の勉強をしている。これまでデータの保存には主にCSV等のテキスト形式やXML、オブジェクトのシリアライズ形式を使っていたのだが、毎回一から作っているのがいいかげん不毛な気がしたのと、これから大規模なシステムを作る際には何か標準的な方法を知っていた方がいいだろうということで、リレーショナルデータベースについて勉強してみることにした。

RDBMSの良いところは、

  • データの保存場所やロックの問題を気にしなくていい
  • かなりのことがSQL文でできるので、わざわざロジックを書かなくていい
    • 途中で気が変わって別の言語や環境に移行しても、データはそのまま使える!

あたりだと思う。特に最後の点は重要。今時プログラムよりデータの方が何倍も価値があるので。

それで今は前から作りたいと思っていた書籍管理システムを作っている。このシステムで検索機能をどう実装するかを考えているのだが、良い方法が分からない。特に、複数のキーワードが入力されたときに、全てのキーワードがどれかのフィールドに部分一致するデータを検索するというような場合に一般的な方法があれば知りたい。どのSQLの本を見ても全然そういうことが書いてなくて。一応、思いついた方法としては以下の3パターン。どれも一長一短ある。

  • 1.その場で複雑なSQL文を組み立てる
    • →泥臭いが確実。ソースコードの見通しが悪くなるので、できればやりたくない
  • 2.全文検索用のデータを別に持つ
    • →一番高速化が期待できる。元データと全文検索用のデータの同期が問題
  • 3.SQLでは単純なことだけしてプログラム側で何とかする
    • →最後の手段。総データ件数に比例して時間がかかる

ちなみに、今作っている書籍管理システムはWebベースで、だいたい最低限必要な機能の60%〜70%ぐらいができたところ。以前WebアプリケーションをGUIから作り始めた結果データ保存形式に無理が生じて挫折したことがあったので、その反省から今回は極力GUIに凝らずに作ることを心がけているのだが、ちょっと見た目を改善しようとしたらあっという間にGmailもどきになった(笑)。