Thread: 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 >> > > >