Weitere ähnliche Inhalte Ähnlich wie ゆるいテキスト検索 (11) Mehr von Toshi Harada (20) ゆるいテキスト検索2. 自己紹介
名前:ぬこ@横浜
仕事:ラーメンレビュー
副業:某通信系SI会社勤務
最近、(誰得な)PostgreSQL拡張に
はまってます。
3. 誰得
?
つくったもの
xml_fdw:XMLファイルを
SQLで検索するFDW
ksj:漢数字で演算する型
15. にゃー ニャー
「ねこ」も「ネコ」も
全く同じように可愛いのだが
TEXT型では
SELECT 'ねこ' = 'ネコ'
⇒false
trueでいいじゃんかよ!
21. ntext EXTENSION feature
・全角数字/半角数字の正規化比較
・全角/半角・大/小英字の正規化比較
・ひらがな/全角カタカナ/半角カタカナの
正規化比較
・正規化SQL関数
・近似比較演算
(多少のtypoがあっても同じと評価)
・btree index対応
23. でも(実
行コ ストが)
お高い
TEXT型と
ん でしょ?
ntext型の
性能比較
24. 環境
Let's note CF-SX2 (メモリ8G、SSD)
CentOS 6.2 on VMWare/Windows8
PostgreSQL 9.2
configurationはデフォルト
測定はpgbenchカスタムクエリモード
27. スループット text型 text型 ntext型 ntext型 ntext型
(SeqScan) (IndexScan) (=検索, (=検索, (/=検索,
SeqScan) IndexScan) SeqScan)
tps 207.364 742.217 30.964 169.894 29.875
平均レスポン text型 text型 ntext型 ntext型 ntext型
ス時間 (SeqScan) (IndexScan) (=検索, (=検索, (/=検索,
SeqScan) IndexScan) SeqScan)
半角数字 1.155 0.070 7.472 1.145 7.822
全角数字 1.231 0.067 8.362 1.230 8.651
半角英字 1.152 0.071 7.966 2.145 8.297
ひらがな 1.234 0.067 8.429 1.311 8.692
28. pgbench による tps 測定(スループット)
text 型
(SeqScan)
text 型
(IndexScan)
ntext 型
tps ( = 検索 , SeqScan )
ntext 型
( = 検索 , IndexScan )
ntext 型
( /= 検索 , SeqScan )
0 100 200 300 400 500 600 700 800
29. pgbench による tps 測定(平均レスポンス時間)
ひらがな
text 型
(SeqScan)
半角英字 text 型
(IndexScan)
ntext 型
( = 検索 , SeqScan )
ntext 型
( = 検索 , IndexScan )
全角数字 ntext 型
( /= 検索 , SeqScan )
半角数字
0.000 1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000
40. (」・
ω ・)」う
ナイアーラトテップ
ー!
(/・
ω・ )/に
ゃー
ナイアーラソテップ
!
ナイアルラトホテップ
ニャルラトテップ
ニャルラトホテプ
これは、同一の神性の名前・・・
機械的正規化ではどうにもならんかも
(近似検索でも厳しいかも?)
41. シソーラスの導入?
,,,,,,,,,,,,,,,,,,,,
/": : : : : : : : \
/-─-,,,_: : : : : : : : :\
/ '''-,,,: : : : : : : :i
/、 /: : : : : : : : i ________
r-、 ,,,,,,,,,,、 /: : : : : : : : : :i /
L_, , 、 \: : : : : : : : :i / シソーラスを使ったら
/●) (●> |: :__,=-、: / < 負けかなと思ってる
l イ '- |:/ tbノノ \
l ,`-=-'\ `l ι';/ \ 会社員(??歳・男性)
ヽトェ-ェェ-:) -r'  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
ヾ=-' / /
____ヽ::::... / ::::|
/ ̄ ::::::::::::::l `──'''' :::|
43. 正規化と近似検索相当
(あとシソーラス)は、
実は既にある。
正規化:textsearch_ja
シソーラス:textsearch
近似検索:pg_trgmのsimilarity関数
近似検索:contrib/fuzzystrmatch
44. 教訓・・・
r ‐、
| ○ | r‐‐、
_,;ト - イ、 ∧l☆│∧ 良い子の諸君!
(⌒` ⌒ヽ /,、,,ト.-イ/,、 l
|ヽ ~~⌒γ ⌒ ) r'⌒ `!´ `⌒) いい拡張を思いついた!と思っても
│ ヽー―'^ー-' ( ⌒γ ⌒~~ / 大抵それは「先人が思いついた」ものだ
│ 〉 |│ |`ー^ー― r' |
│ /───| | |/ | l ト、 | 類似の拡張がないか調べてから
| irー-、 ー ,} | / i 作るんだぞ!
| / `X´ ヽ / 入 |
51. 【pg_trgmのみ】
SELECT id, data FROM test
WHERE data LIKE
'%PostgreSQL%';
【pg_trgm+正規化組み込み】
SELECT id, data FROM test
WHERE pg_ntext_normalize(data::ntext)::text LIKE
pg_ntext_normalize('%PostgreSQL%')::text; に
)の代わり もOK
omalize( alize()で
text_n ja_norm
pg_n h_jaの
arc
textse
53. 正規化組み込み前
「ラーメン」では
「らーめん」や「ラーメン」が
ヒットしない。
(´・ω・`) ショボーン
63. HOOKとは?
フック(Hook)とは、
特定の場面で呼び出される処理を、
ユーザが定義した処理に置き換える機能
ex. auto_explain, pg_statsinfo,
SE-PostgreSQL, ・・・
66. Postg
reS QL 9
.2 .3の場
【backend/util/adt/tsvector_op.c】
合
int (*TsearchCompare_hook) (char* a, char* b, int len) = NULL; // add by
nuko
・・・
if (TsearchCompare_hook == NULL)
{
cmp = memcmp(a, b, Min(lena, lenb));
}
else
{
// Custom Compare Hook Functoin Call
cmp = (*TsearchCompare_hook) (a, b, Min(lena, lenb));
}
・・・
else if ((TsearchCompare_hook == NULL) && cmp == 0 &&
lena != lenb) // modify by nuko
{
cmp = (lena < lenb) ? -1 : 1;
}
68. 【ts_compare/tsearch_hook.c】
・・・
extern void _PG_init(void);
/*
* TsearchCompare_hook
* Custom approx compare function
*/
static int
TsearchCompareApprox(char* a, char* b, int len)
{
・・・実際の近似評価用のコード
}
・・・
/*
* Module initialization function
*/
void
_PG_init(void)
{
/* activate hook module is loaded */
TsearchCompare_hook = TsearchCompareApprox;
}
76. ニッチす
ぎて無
理か
試作したtextsearch
な・・・
評価関数のHOOKを
コミュニティに提案
する価値はあるか?