textsearch_jaのts_headline()があやしい
textsearch_jaの調べ物をしていて別の問題がみつかった。
ts_headline()で強調文字の埋め込みと一緒に、特定の記号を除去するようなのだが、そのときに変なゴミ(\x0B)がts_headline()の結果に現れるのだ。
test=# SELECT ts_headline('japanese', '猫(cat)は可愛い', to_tsquery('japanese','猫') ) ; ts_headline --------------------------- <b>猫</b>cat)\x0Bは可愛い (1 row)
除去される全角括弧の中にASCII文字が入っているとこの現象が発生するようだ。全角括弧内に全角文字が入っていると、単に全角括弧が除去されるのみ。
test=# SELECT ts_headline('japanese', '猫(ぬこ)は可愛い', to_tsquery('japanese','猫') ) ; ts_headline ----------------------- <b>猫</b>ぬこは可愛い (1 row)
たぶん、ts_headline()に渡す文字列内に除去文字がある、かつその除去文字の直後にASCII文字が入っていると発生するのではないかと。
test=# SELECT ts_headline('japanese', '猫,cat,ぬこ,kitten,は可愛い', to_tsquery('japanese','猫') ) ; ts_headline ------------------------------------------ <b>猫</b>cat,\x0Bぬこkitten,\x0Bは可愛い (1 row)
ts_headline()内でjapanese wordか、ASCII wordかを判定している箇所があるけど、そのあたりの処理で何か問題があるのだろうか。
なお、この問題は英語辞書を使うケースだと発生しない(というか、","の除去もしない)。
test=# SELECT ts_headline('english', '猫,cat,ぬこ,kitten,は可愛い', to_tsquery('english','猫') ) ; ts_headline ------------------------------------ <b>猫</b>,cat,ぬこ,kitten,は可愛い (1 row)
もう少し調べてみるか・・・