民芸的プログラミング 〜ソフトウェア開発日記〜

アクセスカウンタ

zoom RSS 人名を検索するには?(1)

<<   作成日時 : 2008/07/06 19:09   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

過去の大量の受験者データを無事SQLiteのDBに取り込んで一安心していたところ、次の課題が持ち上がってきた。それは人名の検索だ。SQLiteを使っている限り、人名の完全一致検索と前方一致検索に関してはインデックスが使える。が、日本人の場合、現実には苗字が変わることがある。受験者が常に「受検時の」苗字を名乗ってくれるとは限らない。そういった場合、名前のほうで検索することになるのだが...

手元のDBの件数は300万件を越えている。受験生の名前は姓と名には分かれていない状態で格納されている。これを名前で検索すると、後方一致検索となり、インデックスが使えない。かといって、インデックスを使わずに300万件をべたで検索すると、とてもではないが実用的な時間内に結果を得ることができない。

小手先のテクニックとしては、人名を完全に前後逆転させたカラムを一つ追加し、それに対してもインデックスを作成しておき、名前だけで検索したい場合は、毎回検索対象の名前を前後逆転させて(頭の中で逆転させてもいいし、プログラムを一つかませてもいい)、その逆転カラムに対して検索をかけるというやり方もある(DBによってはこのような逆インデックス機能を最初から持っていたりするのだが、SQLiteには搭載されていないので、面倒だが逆転カラムを用意するところから始めなければならない)。
この逆転インデックスというテクニックも使えば99%以上の案件は多分処理できると思うのだが、もっと微妙な場面では、中間一致検索も必要になってくるかも知れない。場合によっては受検者名の入力ミスなどもあるかも知れない。そもそも状況によって検索対象のカラムを変えないといけないというのが気に入らない。もっとシンプルなやり方はないものか...

というわけで、全文検索を使う方法でどうにかなるかと思い、使い慣れたNamazuでと思ったのだが、だいたい、人名フィールドをNamazuで分かち書きしてまともに機能するはずなどない。N-gram方式の全文検索が必要になるだろうと、そこまでは頭の中でひらめいたのだが、先が続かず、ネットで色々と調べものをしてみた。
Namazu Projectのホームページや、Hyper Estraierのホームページ、Wikipediaの記事なども参考になったのだが、今日、一番参考になったのは「検索エンジンを作る」と題されたこのページ。

http://gihyo.jp/dev/serial/01/make-findspot

新規に検索エンジンを開発した記録とそれに関する資料がまとめられている。
まだ途中までしか読んでいないけれど...この記事に励まされて、自力で簡単な全文検索モジュールを書くことになるかもしれないと言う予感がしてきた。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
人名を検索するには?(1) 民芸的プログラミング 〜ソフトウェア開発日記〜/BIGLOBEウェブリブログ
文字サイズ:       閉じる