[pgsql-jp: 37871] lc_collat=Cだとto_tsqueryに日本語が使えない
yutaka hoshino
yoko00068 @ gmail.com
2006年 12月 27日 (水) 18:33:54 JST
こんにちは、ヨコロッパと申します
PostgreSQL 8.2 + GIN + tsearch2 + mecab で
日本語の全文検索にチャレンジしています。
はじめは順調にできたのですが、日本語のソートをするために
--no-locale付きでinitdb しなおしたところ
to_tsquery() に日本語が使えなくなってしまいました
なにか心当たりのある方いらっしゃいますでしょうか
--- lc_collate がja_JP.UTF-8の場合(成功)
>$ initdb -E UTF-8 -D /usr/local/pgsql/data
>$ pg_ctl start
>$ createdb test
>$ cd /usr/local/src/postgresql-8.2.0/contrib/tsearch2/
>$ make clean
>$ make
>$ make install
>$ psql -f tsearch2.sql test
>$ psql test
>test=# show lc_collate ;
> lc_collate
>------------
> ja_JP.UTF8
>(1 row)
>test=# select to_tsquery('simple','テスト') ;
> to_tsquery
>------------
> 'テスト'
>(1 row)
--- lc_collate がCの場合(失敗)
>$ initdb -E UTF-8 -D /usr/local/pgsql/data --no-locale
>$ pg_ctl start
>$ createdb test
>$ cd /usr/local/src/postgresql-8.2.0/contrib/tsearch2/
>$ make clean
>$ make
>$ make install
>$ psql -f tsearch2.sql test
>$ psql test
>test=# show lc_collate ;
> lc_collate
>------------
> C
>(1 row)
>test=# select to_tsquery('simple','テスト') ;
>NOTICE: query contains only stopword(s) or doesn't contain lexeme(s), ignored
>NOTICE: query contains only stopword(s) or doesn't contain lexeme(s), ignored
> to_tsquery
>------------
>
>(1 row)
なにか壊れてしまったと思い、ja_JP.UTF8にてinitdbから再作成したところ
to_tsquery()で日本語が使えるように戻りました。(壊れていなかった)
環境:
test=# select version() ;
PostgreSQL 8.2.0 on i686-pc-linux-gnu, compiled by GCC gcc (GCC)
3.4.6 20060404 (Red Hat 3.4.6-3)
ソースを見たところクエリワードを分解しているところでマルチバイトが
検索に有効な文字(OPERAND)として扱われていないようです
>test=# select to_tsquery('testテストtest') ;
> to_tsquery
>-----------------
> 'test' & 'test'
>(1 row)
# 「.」や「#」と同じく「&」扱いされてしまう
しかしどこで判定しているか見つけることができませんでした
pgsql-jp メーリングリストの案内