ntext型実装つづき

機能拡張

正規化テキスト型ntext型の機能をちょっと拡張してみた。

  • 半角カタカナ対応
  • 近似検索

半角カタカナ対応

方式は別に難しくはないが、若干面倒な部分があったので実装するのは後回しにしていたが、今日ちょっと時間がとれたので実装してみた。

面倒な部分

半角カタカナは「ダ」のように「タ」と「゛」の濁点部分が分離している。
「ダ」を「ダ」に正規化する場合「タ」の次に濁点があるかどうかを判断しなくてはいけないので、ちょっと面倒なのだ。
さらに「ヴァ」を「バ」に正規化する場合、最大2文字先までを見て判断する必要がある。
とはいえ、例外的なパターン以外は変換表で対応可能ではある。

実行例
demo=# SELECT * FROM ntext_t WHERE data = 'エヴァンゲリオン';
 id |       data       
----+------------------
  1 | エヴァンゲリヲン
  2 | エバンゲリオン
  3 | エヴァンゲリヲン
  4 | エヴァンゲリオン
(4 rows)

demo=# 

近似検索

昨年末ころに、ASCII文字限定で、多少のtypoを許容する比較演算関数と比較演算子 /= を実験的に作成したのが、これを今回 ntext に組込みことにした。
実装自体はシンプルなもので、先頭から1文字づつ比較して同じ文字であれば類似度スコアを加算し、比較対象のうちより長い方の文字数で除算を行い、70%以上の類似度であれば「だいたいあってる」とみなして真と判断する。

実行例
demo=# SELECT * FROM ntext_t WHERE data = 'ナイアーラトテップ';
 id |        data        
----+--------------------
 17 | ナイアーラトテップ
(1 row)

demo=# SELECT * FROM ntext_t WHERE data /= 'ナイアーラトテップ';
 id |         data         
----+----------------------
 17 | ナイアーラトテップ
 18 | ナイアーラソテップ
 19 | ナイアルラトホテップ
(3 rows)

demo=# 

でも、この比較演算でも「ニャルラホトテプ」とかは引っ掛けられないのよね(´・ω・`)
そこまで対応しようとするとシソーラス辞書を組み込むしかないのかなあ。
でも
シソーラスを使ったら負けかなと思ってる 会社員(??歳 男性)」
という気もするので、シソーラスはなるべく組込みたくない・・・

性能測定

ついでに正規化と近似検索を組み込んだはいいのだが、やはり性能がどのくらい劣化するのか測定してみようと思った。

環境
  • 手持ちのLet' note(CF-SX-2)
  • メモリ8GB、VMには2GB
  • CentOS 6.3 on VMWare
  • ntext型に10文字のテキストを10000件挿入
  • 比較のために通常のtext型にも10000件挿入
測定方法
  • pgbenchのカスタムクエリモードを使用
  • 4種類のクエリを実行
  • 実行トランザクション数は1000
  • 同時実行数は1
測定結果

  • 平均レスポンス

  • つまり・・・
    • text型と比較するとやはり遅すぎる。
    • 風が語りかけます。遅い、遅すぎる

今後

  • やっぱり性能がなあ・・・
    • 今回はあまり性能を考えず配列の変換テーブルを使ったがきちんとハッシュテーブルなどを使って変換して正規化の性能を向上させたほうがいいのだろうなあ。
  • シソーラスの組込みをすべきか・・・悩む。
  • カスタム変換規則を組む込めるようにすべきかなあ・・・
  • つーか、まだコンパイル時の警告を取りきってないのはどうにかしろとw
  • コードを整備したらGithubに上げよう。