Обсуждение: tsearch2 и unicode
Добрый день
Преамбула: пытаюсь настроить русский полнотекстный поиск в MediaWiki
(wiki-движок который используется в Википедии) с использование в
качестве хранилища PostgreSQL версии 8.1.4
Амбула: MediaWiki пишет текст всегда в UTF8, поэтому, естественно
настроить tsearch2, чтобы работал с unicode. Для этого собрал и установил
tsearch2 из PostgreSQL 8.2 (tsearch2.82.tar.gz с официального сайта
tsearch2), который поддерживает UTF-8. Сделал initdb с ключиком
--locale=ru_RU.UTF-8
Возникло непонимание:
wikidb=# show lc_collate;
lc_collate
-------------
ru_RU.UTF-8
(1 row)
wikidb=# select * from pg_ts_cfg;
ts_name | prs_name | locale
-----------------+----------+--------------
default_russian | default | ru_RU.KOI8-R
utf8_russian | default | ru_RU.UTF-8
simple | default |
default | default | ru_RU.UTF-8
(4 rows)
Есть некое текстовое поле old_text в таблице mediawiki.pagecontent -
запись в UTF8, а клиент у меня в koi8, поэтому для отображения использую
convert
wikidb=# select convert(old_text,'UTF8','KOI8'),
to_tsvector(old_text) from mediawiki.pagecontent
where old_id=1500;
convert | to_tsvector
-------------+-------------
proba проба | 'proba':1
(1 row)
! В результате индексируется только латиница
Аналогичную процедуру сделал когда initdb запускалась с ключиком
--locale=ru_RU.KOI8-R
wikidb=# show lc_collate;
lc_collate
--------------
ru_RU.KOI8-R
wikidb=# select * from pg_ts_cfg;
ts_name | prs_name | locale
-----------------+----------+--------------
default_russian | default | ru_RU.KOI8-R
utf8_russian | default | ru_RU.UTF-8
simple | default |
default | default | ru_RU.KOI8-R
(4 rows)
wikidb=# select convert(old_text,'UTF8','KOI8'),
to_tsvector(convert(old_text,'UTF8', 'KOI8')) from
mediawiki.pagecontent where old_id=1499;
convert | to_tsvector
-------------+---------------------
проба proba | 'proba':2 'проба':1
(1 row)
------
То есть в первом случае русские слова не индексируются, а во втором
проблем нет. В каком месте разложены грабли?
С уважением
Евгений
P.S. С наступившим Новым Годом всех, естественно.
pg_ts_cfg - в Ваших распоряжении, Вам надо только проапдейтить её :-) указав таким образом, какая рабочая кодировка используется. Вот пример создания рабочей конфигурации "с нуля" (кстати, как раз UTF-8): http://www.sai.msu.su/~megera/wiki/pgweb_cfg On 1/3/07, Evgeny M. Baldin <E.M.Baldin@inp.nsk.su> wrote: > Добрый день > > Преамбула: пытаюсь настроить русский полнотекстный поиск в MediaWiki > (wiki-движок который используется в Википедии) с использование в > качестве хранилища PostgreSQL версии 8.1.4 > > Амбула: MediaWiki пишет текст всегда в UTF8, поэтому, естественно > настроить tsearch2, чтобы работал с unicode. Для этого собрал и установил > tsearch2 из PostgreSQL 8.2 (tsearch2.82.tar.gz с официального сайта > tsearch2), который поддерживает UTF-8. Сделал initdb с ключиком > --locale=ru_RU.UTF-8 > > Возникло непонимание: > > wikidb=# show lc_collate; > lc_collate > ------------- > ru_RU.UTF-8 > (1 row) > > wikidb=# select * from pg_ts_cfg; > ts_name | prs_name | locale > -----------------+----------+-------------- > default_russian | default | ru_RU.KOI8-R > utf8_russian | default | ru_RU.UTF-8 > simple | default | > default | default | ru_RU.UTF-8 > (4 rows) > > > Есть некое текстовое поле old_text в таблице mediawiki.pagecontent - > запись в UTF8, а клиент у меня в koi8, поэтому для отображения использую > convert > > wikidb=# select convert(old_text,'UTF8','KOI8'), > to_tsvector(old_text) from mediawiki.pagecontent > where old_id=1500; > > convert | to_tsvector > -------------+------------- > proba проба | 'proba':1 > (1 row) > > ! В результате индексируется только латиница > > Аналогичную процедуру сделал когда initdb запускалась с ключиком > --locale=ru_RU.KOI8-R > > wikidb=# show lc_collate; > lc_collate > -------------- > ru_RU.KOI8-R > > wikidb=# select * from pg_ts_cfg; > ts_name | prs_name | locale > -----------------+----------+-------------- > default_russian | default | ru_RU.KOI8-R > utf8_russian | default | ru_RU.UTF-8 > simple | default | > default | default | ru_RU.KOI8-R > (4 rows) > > > wikidb=# select convert(old_text,'UTF8','KOI8'), > to_tsvector(convert(old_text,'UTF8', 'KOI8')) from > mediawiki.pagecontent where old_id=1499; > convert | to_tsvector > -------------+--------------------- > проба proba | 'proba':2 'проба':1 > (1 row) > ------ > > То есть в первом случае русские слова не индексируются, а во втором > проблем нет. В каком месте разложены грабли? > > С уважением > Евгений > > P.S. С наступившим Новым Годом всех, естественно. > ---------------------------(end of broadcast)--------------------------- > TIP 7: You can help support the PostgreSQL project by donating at > > http://www.postgresql.org/about/donate > -- Best regards, Nikolay
Добрый день
Проблема решилась тем, что я скачал и собрал PostgreSQL 8.2 - заработало
и с локалью ru_RU.UTF-8. Почему не работала раньше я так и не понял.
> pg_ts_cfg - в Ваших распоряжении, Вам надо только проапдейтить её :-)
> указав таким образом, какая рабочая кодировка используется.
На сколько я понимаю в pg_ts_cfgmap всё было описано правильно и по
умолчанию использовалсь utf8_russian.
С уважением
Евгений
P.S. В последней стабильной версии MediaWiki 1.8.2 при работе с PostgreSQL
есть бага (?) которая не позволяет организовать полнотекстный поиск для
нелатиницы (например, русских слов). Я попытался описать решение в
меру своего понимания вот здесь:
http://bugzilla.wikimedia.org/show_bug.cgi?id=8470
On Wed, 3 Jan 2007, Nikolay Samokhvalov wrote:
> pg_ts_cfg - в Ваших распоряжении, Вам надо только проапдейтить её :-)
> указав таким образом, какая рабочая кодировка используется.
>
> Вот пример создания рабочей конфигурации "с нуля" (кстати, как раз
> UTF-8): http://www.sai.msu.su/~megera/wiki/pgweb_cfg
>
> On 1/3/07, Evgeny M. Baldin <E.M.Baldin@inp.nsk.su> wrote:
>> Добрый день
>>
>> Преамбула: пытаюсь настроить русский полнотекстный поиск в MediaWiki
>> (wiki-движок который используется в Википедии) с использование в
>> качестве хранилища PostgreSQL версии 8.1.4
>>
>> Амбула: MediaWiki пишет текст всегда в UTF8, поэтому, естественно
>> настроить tsearch2, чтобы работал с unicode. Для этого собрал и установил
>> tsearch2 из PostgreSQL 8.2 (tsearch2.82.tar.gz с официального сайта
>> tsearch2), который поддерживает UTF-8. Сделал initdb с ключиком
>> --locale=ru_RU.UTF-8
>>
>> Возникло непонимание:
>>
>> wikidb=# show lc_collate;
>> lc_collate
>> -------------
>> ru_RU.UTF-8
>> (1 row)
>>
>> wikidb=# select * from pg_ts_cfg;
>> ts_name | prs_name | locale
>> -----------------+----------+--------------
>> default_russian | default | ru_RU.KOI8-R
>> utf8_russian | default | ru_RU.UTF-8
>> simple | default |
>> default | default | ru_RU.UTF-8
>> (4 rows)
>>
>>
>> Есть некое текстовое поле old_text в таблице mediawiki.pagecontent -
>> запись в UTF8, а клиент у меня в koi8, поэтому для отображения использую
>> convert
>>
>> wikidb=# select convert(old_text,'UTF8','KOI8'),
>> to_tsvector(old_text) from mediawiki.pagecontent
>> where old_id=1500;
>>
>> convert | to_tsvector
>> -------------+-------------
>> proba проба | 'proba':1
>> (1 row)
>>
>> ! В результате индексируется только латиница
>>
>> Аналогичную процедуру сделал когда initdb запускалась с ключиком
>> --locale=ru_RU.KOI8-R
>>
>> wikidb=# show lc_collate;
>> lc_collate
>> --------------
>> ru_RU.KOI8-R
>>
>> wikidb=# select * from pg_ts_cfg;
>> ts_name | prs_name | locale
>> -----------------+----------+--------------
>> default_russian | default | ru_RU.KOI8-R
>> utf8_russian | default | ru_RU.UTF-8
>> simple | default |
>> default | default | ru_RU.KOI8-R
>> (4 rows)
>>
>>
>> wikidb=# select convert(old_text,'UTF8','KOI8'),
>> to_tsvector(convert(old_text,'UTF8', 'KOI8')) from
>> mediawiki.pagecontent where old_id=1499;
>> convert | to_tsvector
>> -------------+---------------------
>> проба proba | 'proba':2 'проба':1
>> (1 row)
>> ------
>>
>> То есть в первом случае русские слова не индексируются, а во втором
>> проблем нет. В каком месте разложены грабли?
>>
>> С уважением
>> Евгений
>>
>> P.S. С наступившим Новым Годом всех, естественно.
>> ---------------------------(end of broadcast)---------------------------
>> TIP 7: You can help support the PostgreSQL project by donating at
>>
>> http://www.postgresql.org/about/donate
>>
>
>
>