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=#
でも、この比較演算でも「ニャルラホトテプ」とかは引っ掛けられないのよね(´・ω・`)
そこまで対応しようとするとシソーラス辞書を組み込むしかないのかなあ。
でも
「シソーラスを使ったら負けかなと思ってる 会社員(??歳 男性)」
という気もするので、シソーラスはなるべく組込みたくない・・・
性能測定
ついでに正規化と近似検索を組み込んだはいいのだが、やはり性能がどのくらい劣化するのか測定してみようと思った。
環境
測定方法
- pgbenchのカスタムクエリモードを使用
- 4種類のクエリを実行
- 実行トランザクション数は1000
- 同時実行数は1