キーワード検索を「あいまい」化

● 前オキ

文字列の集合から、特定の文字を検索する際のカユイ点は、文字の厳格性の問題じゃないでしょうか。つまり、「半角(w)・全角(w)」「大文字(A)・小文字(a)」「ひらがな(あ)・カタカナ(ア)」ってのが、普通は別の文字である・・・って、コトです。だから、データには「HANZ」があっても、検索キーワードが「hanz」では、ヒットしてくれない。

これ、何年か前にお得意先の蔵書の管理システムを移植再構築している際に、カユサを感じて対応策を調べていたのです。で、RDBS での関数で強引に差違を吸収してしまうというアイデアを発見し、イタク感激したものです。現在改めて調査したところ、postgresql で文字コードがUTF-8 であればナニヤラおいしいことが出来そうなトピックスがあったのですが、上手く動作しないので、結局上記のテクニックを当初の「英数字のみ」の処理から、「ひらがな・カタカナ」にも対応出きるように、50音を声に出しながら追加したので、忘れないように記録しておきます。

● 具体的な作業

—– postgresql の関数として —– 例えばconv.sqlというファイル名で、以下を作成。

CREATE OR REPLACE FUNCTION conv(text) RETURNS text AS $$
SELECT translate(upper($1)
,’abcdefghijklmnopqrstuvwxyzあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽゃゅょ-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ‘
,’ABCDEFGHIJKLMNOPQRSTUVWXYZアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポャュョ-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ’);
$$ LANGUAGE SQL IMMUTABLE;

———

で、psql 起動して、「\i conv.sql」 で、関数を作成。関数の存在を確認したければ「 \df」で、関数の中身を確認したければ「select prosrc from pg_proc where proname=’conv’;」で、見えます。

で、これを利用したい時の sql文は、こんな感じ。

select * from HogeHoge where conv(name) like conv(“キーワード”);

##########
あ!、この sql文 は、postgresql に依存しているじゃん!ってことはインターフェースから実装するDAOクラスにそのニュアンスを入れておいたほうがイイネ。

HogeHogeDaoByHibernateForPostgresql とかね。
##########

● 課題

斉藤・斎藤・齋藤・・・といった似たような呼称問題だけど、これは読み仮名などを利用すれば実装上で解決できるかな?(ちょいゴマカシ臭いケド)

といっても、結局「かな・漢字」問題は残るケドね。例えば「らーめん・拉麺」といった感じのパターンじゃ!こういったモノを全部やっつけられれば、google のようなカラクリが実装できるのでしょうが、そんなことに「力」(こだわり)を、かけ続けても本末転倒な「感」もあるので、ここら辺で勘弁してヤル。

  1. 365日あす楽★代引?送料無料★ バギーガード ビーフック ベビーカー?バギー
    11月 17th, 2015 at 21:31 | #1

    !情報をありがとうございました。興味深い情報を

  2. admin
    11月 27th, 2015 at 10:05 | #2

    いえいえ、どういたしまして、お役に立てたなら幸いです。