Обсуждение: tsearch2 и unicode

Поиск
Список
Период
Сортировка

tsearch2 и unicode

От
"Evgeny M. Baldin"
Дата:
Добрый день

  Преамбула: пытаюсь настроить русский полнотекстный поиск в 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. С наступившим Новым Годом всех, естественно.

Re: tsearch2 и unicode

От
"Nikolay Samokhvalov"
Дата:
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

Re: tsearch2 и unicode

От
"Evgeny M. Baldin"
Дата:
Добрый день

  Проблема решилась тем, что я скачал и собрал 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
>>
>
>
>