[pgsql-jp: 37872] Re: lc_collat=Cだとto_tsqueryに日本語が使えない

YuGo yu.gotou @ gtec-ni.com
2006年 12月 27日 (水) 18:51:12 JST


こんにちは。
localeはja_JPにして、lc_collateだけCにするというのはどうですか。
initdb --encoding=UTF-8 --locale=ja_JP --lc-collate=C

> こんにちは、ヨコロッパと申します
> 
> 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 メーリングリストの案内