キーワード検索を「あいまい」化・・・その後のカタカナ濁音の対応

すごく久しぶりに当方のサイトの管理画面に入って見ました。最終の投稿は2021.6.16なので、サホドではなかったデスね。

さて、その投稿も予約語に関する再度の覚書でしたが、実は今回も2012.3.15のキーワード検索を「あいまい」化の再検討のオハナシです。

今まで作成してきたシステムはマスタデータの登録は、手入力の画面も用意してはありますが、基本的には別システムのデータをcsv形式でインポートさせちゃうので、カタカナに関しては全角なのか?半角なのか?は、統一されておりました。

ちなみに、当方では2004年から専門学校でコンピュータの講義をさせてもらってますが、この半角カタカナを採用せざるを得なかった当時のジジョウや、これは当時はもちろん現在でもガラパゴス的なモノなので、「極力使うな!」否「使ってはイケナイ!」・・・などと申しております。

今回、困ったのはこの全角カタカナと半角カタカナが混在するデータがありまして、検索の際にカタカナの濁音問題で、欲しいデータがヒットしないとの声を頂いたのです。

ウーム。これは困った。濁音カタカナは全角では1文字だが半角では2文字だぞ。検索キーをプログラムで、全角バージョンと半角バージョンに変換して、「or」で処理するか????
なんぞと、おバカな構想をしておりましたが、ググってみればよい知恵を出してくれているでは「あ~りませんか」。

そうです。ぜんかいと同様にD/Bに依存しちゃいますが、D/B側の関数で処理します。

以下に今回参考にさせてもらいながら作った関数を書きますね。

—————————–

CREATE OR REPLACE FUNCTION conv(param character varying)
RETURNS character varying AS
$BODY$
declare
c_half character varying :=param;
begin
–アルファベットの変換
c_half = translate(c_half,
‘abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’,
‘ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ’
);
–数値
c_half = translate(c_half,
‘1234567890’,
‘1234567890’
);
–カタカナ(濁音)
c_half := replace(replace(replace(replace(replace(replace(c_half,’ヴ’,’ヴ’ ) ,’ガ’,’ガ’ ),’ギ’,’ギ’ ),’グ’,’グ’ ),’ゲ’,’ゲ’ ),’ゴ’,’ゴ’ );
c_half := replace(replace(replace(replace(replace(c_half ,’ザ’,’ザ’ ),’ジ’,’ジ’ ),’ズ’,’ズ’ ),’ゼ’,’ゼ’ ),’ゾ’,’ゾ’ );
c_half := replace(replace(replace(replace(replace(c_half ,’ダ’,’ダ’ ),’ヂ’,’ヂ’ ),’ヅ’,’ヅ’ ),’デ’,’デ’ ),’ド’,’ド’ );
c_half := replace(replace(replace(replace(replace(c_half ,’バ’,’バ’ ),’ビ’,’ビ’ ),’ブ’,’ブ’ ),’ベ’,’ベ’ ),’ボ’,’ボ’ );
c_half := replace(replace(replace(replace(replace(c_half ,’パ’,’パ’ ),’ピ’,’ピ’ ),’プ’,’プ’ ),’ペ’,’ペ’ ),’ポ’,’ポ’ );
–カタカナ
c_half = translate(c_half,
‘アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォカケッャュョワ’,
‘アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォヵヶッャュョヮ’
);
–ひらがな
c_half = translate(c_half,
‘あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉっゃゅょゎ’,
‘アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポァィゥェォッャュョヮ’
);
/*
–記号
c_half = translate(c_half,
‘ !”#$%&()ー-=^~|@`「[{;+:*」]}、,<。.>・/?_’,
‘ !”#$%&()ー-=^~|@‘「[{;+:*」]}、,<。.>・/?_’
);
*/
c_half := replace(c_half,””,’’’ );
c_half := replace(c_half,chr(92),’¥’ );
return c_half;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

—————————–

上記で、コメントアウトしている記号の部分は活かすと上手く行かなかったのでハズしました。

# ちなみに専門学校の学生に紙に文字を書かせると「この講義の内容を仕事に生かして」と、「活かして」が書けない学生が非常に多いです。

今回の試行錯誤で、最初に参考にした関数を使うと、postgres9.hogehogeでは動作して「よし、対応出来たゾイ」と、幕を下ろすハズだったのですが、なんとpostgres8.hogehogeでは動作しなかったのです。

調べるとマズ、8ではplpgsqlがないとのことで、

createlang -d mighty plpgsql

posgre君のコマンドプロンプトから上記を実行。

でも、ダメっぽい。

さらに試行錯誤して、どうやら引数の受け取りが上手く出来ていない感があるので、上記のように型名だけでなく変数名も宣言して、declareで代入と動作しました。

# 引数の配列的な宣言$1が解釈できなかったのカナ?

以上、理屈はとも角、動けばヨイというショーモナイ対応でアリました。

追記:あとレスポンスにエライ時間かかるようになるから、半角カタカナが居ない環境ではヤメタ方がイイネ!

  1. No comments yet.