[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 メーリングリストの案内