Обсуждение: FTS, ISPELL и Ё
Hello, world!
Решил поэкспериментировать в FreeBSD6.3 под PostgreSQL 8.3.5 (+ICU) с
FTS. В качестве словаря выбрал Ispell 0.99g5, собрал с поддержкой 'ё'.
Сразу возникла проблема: 'самолёт' @@ 'самолет' = false. Ок, пересобрал
без поддержки 'ё' => 'самолёт' @@ 'самолет' = false. Ок, собрал,
распарсил, вырезал ё руками (ни в одной строчке не оставил 'ё') -
'самолёт' @@ 'самолет' = false, при этом 'самолёты', 'самолётами', ...
нормально приводятся к каноническому виду (как???).
Привожу код:
-------------------------------------------------------- CUT
CREATE SCHEMA library;
CREATE TEXT SEARCH DICTIONARY library.ispell_ru (
    TEMPLATE  = ispell,
    DictFile  = ispell_ru,
    AffFile   = ispell_ru,
    StopWords = russian
);
CREATE TEXT SEARCH CONFIGURATION library.russian (
    COPY = russian
);
ALTER TEXT SEARCH CONFIGURATION library.russian
    ALTER MAPPING FOR hword, hword_part, word
        WITH library.ispell_ru, russian_stem;
ALTER TEXT SEARCH CONFIGURATION library.russian
    DROP MAPPING FOR
        email,
        file,
        float,
        host,
        sfloat,
        url,
        url_path,
        version;
-------------------------------------------------------- CUT
На время, чтобы на долго не застревать, написал функции, подменяющие
ё->е в поиске и записи в БД, но хотелось бы понять и решить проблему...
WBR!
			
		Немного разобрался: на слова с буквой ё срабатывает словарь russian_stem. Теперь как сделать чтобы ёж == еж ? )) Александр В. Сизов пишет: > Hello, world! > > Решил поэкспериментировать в FreeBSD6.3 под PostgreSQL 8.3.5 (+ICU) с > FTS. В качестве словаря выбрал Ispell 0.99g5, собрал с поддержкой 'ё'. > Сразу возникла проблема: 'самолёт' @@ 'самолет' = false. Ок, > пересобрал без поддержки 'ё' => 'самолёт' @@ 'самолет' = false. Ок, > собрал, распарсил, вырезал ё руками (ни в одной строчке не оставил > 'ё') - 'самолёт' @@ 'самолет' = false, при этом 'самолёты', > 'самолётами', ... нормально приводятся к каноническому виду (как???). > Привожу код: > > -------------------------------------------------------- CUT > CREATE SCHEMA library; > > CREATE TEXT SEARCH DICTIONARY library.ispell_ru ( > TEMPLATE = ispell, > DictFile = ispell_ru, > AffFile = ispell_ru, > StopWords = russian > ); > > CREATE TEXT SEARCH CONFIGURATION library.russian ( > COPY = russian > ); > > ALTER TEXT SEARCH CONFIGURATION library.russian > ALTER MAPPING FOR hword, hword_part, word > WITH library.ispell_ru, russian_stem; > > ALTER TEXT SEARCH CONFIGURATION library.russian > DROP MAPPING FOR > email, > file, > float, > host, > sfloat, > url, > url_path, > version; > > -------------------------------------------------------- CUT > > На время, чтобы на долго не застревать, написал функции, подменяющие > ё->е в поиске и записи в БД, но хотелось бы понять и решить проблему... > > WBR! >
15 декабря 2008 г. 2:25 пользователь "Александр В. Сизов" <subs@arpanet.ru> написал: > -------------------------------------------------------- CUT > > На время, чтобы на долго не застревать, написал функции, подменяющие ё->е в > поиске и записи в БД, но хотелось бы понять и решить проблему... Написали функцию -- решили проблему, разве не так? -- Sincerely yours, Nikolay Samokhvalov Postgresmen LLC, http://postgresmen.ru
Nikolay Samokhvalov wrote: > 15 декабря 2008 г. 2:25 пользователь "Александр В. Сизов" > <subs@arpanet.ru> написал: >> -------------------------------------------------------- CUT >> >> На время, чтобы на долго не застревать, написал функции, подменяющие ё->е в >> поиске и записи в БД, но хотелось бы понять и решить проблему... > > Написали функцию -- решили проблему, разве не так? Нет. Это залепа.
Александр, руководствуйтесь здравым смыслом - что проиндексируете, то и
найдете. Никакой магии внутри у нас нет, все отдано здесь на откуп
пользовательскому словарю. Если вы хотите различать 'е' и 'ё', то напишите
словарь-враппер (давно всем предлагаю) вокруг испелла, который опционально
возвращает нормализованные формы и/или оригинальное слово. Его вы используете
пи индексации, а при поиске одну из конфигураций - со словраем, который
понимает 'ё', который не понимает.
Но обычно, просто используйте нечто вроде
to_tsvector(translate(string,'ё','е')) и не будет никаких проблем.
Олег
Олег
On Mon, 15 Dec 2008, "Александр В. Сизов" wrote:
> Hello, world!
>
> Решил поэкспериментировать в FreeBSD6.3 под PostgreSQL 8.3.5 (+ICU) с FTS. В
> качестве словаря выбрал Ispell 0.99g5, собрал с поддержкой 'ё'. Сразу
> возникла проблема: 'самолёт' @@ 'самолет' = false. Ок, пересобрал без
> поддержки 'ё' => 'самолёт' @@ 'самолет' = false. Ок, собрал, распарсил,
> вырезал ё руками (ни в одной строчке не оставил 'ё') - 'самолёт' @@ 'самолет'
> = false, при этом 'самолёты', 'самолётами', ... нормально приводятся к
> каноническому виду (как???).
> Привожу код:
>
> -------------------------------------------------------- CUT
> CREATE SCHEMA library;
>
> CREATE TEXT SEARCH DICTIONARY library.ispell_ru (
>   TEMPLATE  = ispell,
>   DictFile  = ispell_ru,
>   AffFile   = ispell_ru,
>   StopWords = russian
> );
>
> CREATE TEXT SEARCH CONFIGURATION library.russian (
>   COPY = russian
> );
>
> ALTER TEXT SEARCH CONFIGURATION library.russian
>   ALTER MAPPING FOR hword, hword_part, word
>       WITH library.ispell_ru, russian_stem;
>
> ALTER TEXT SEARCH CONFIGURATION library.russian
>   DROP MAPPING FOR
>       email,
>       file,
>       float,
>       host,
>       sfloat,
>       url,
>       url_path,
>       version;
>
> -------------------------------------------------------- CUT
>
> На время, чтобы на долго не застревать, написал функции, подменяющие ё->е в
> поиске и записи в БД, но хотелось бы понять и решить проблему...
>
> WBR!
>
>
     Regards,
         Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83
			
		спс, с translate () как-то все упростилось... )) Oleg Bartunov пишет: > Александр, руководствуйтесь здравым смыслом - что проиндексируете, то > и найдете. Никакой магии внутри у нас нет, все отдано здесь на откуп > пользовательскому словарю. Если вы хотите различать 'е' и 'ё', то > напишите > словарь-враппер (давно всем предлагаю) вокруг испелла, который > опционально > возвращает нормализованные формы и/или оригинальное слово. Его вы > используете > пи индексации, а при поиске одну из конфигураций - со словраем, который > понимает 'ё', который не понимает. Но обычно, просто используйте нечто > вроде to_tsvector(translate(string,'ё','е')) и не будет никаких проблем. > > Олег > > Олег > On Mon, 15 Dec 2008, "Александр В. Сизов" wrote: > >> Hello, world! >> >> Решил поэкспериментировать в FreeBSD6.3 под PostgreSQL 8.3.5 (+ICU) с >> FTS. В качестве словаря выбрал Ispell 0.99g5, собрал с поддержкой >> 'ё'. Сразу возникла проблема: 'самолёт' @@ 'самолет' = false. Ок, >> пересобрал без поддержки 'ё' => 'самолёт' @@ 'самолет' = false. Ок, >> собрал, распарсил, вырезал ё руками (ни в одной строчке не оставил >> 'ё') - 'самолёт' @@ 'самолет' = false, при этом 'самолёты', >> 'самолётами', ... нормально приводятся к каноническому виду (как???). >> Привожу код: >> >> -------------------------------------------------------- CUT >> CREATE SCHEMA library; >> >> CREATE TEXT SEARCH DICTIONARY library.ispell_ru ( >> TEMPLATE = ispell, >> DictFile = ispell_ru, >> AffFile = ispell_ru, >> StopWords = russian >> ); >> >> CREATE TEXT SEARCH CONFIGURATION library.russian ( >> COPY = russian >> ); >> >> ALTER TEXT SEARCH CONFIGURATION library.russian >> ALTER MAPPING FOR hword, hword_part, word >> WITH library.ispell_ru, russian_stem; >> >> ALTER TEXT SEARCH CONFIGURATION library.russian >> DROP MAPPING FOR >> email, >> file, >> float, >> host, >> sfloat, >> url, >> url_path, >> version; >> >> -------------------------------------------------------- CUT >> >> На время, чтобы на долго не застревать, написал функции, подменяющие >> ё->е в поиске и записи в БД, но хотелось бы понять и решить проблему... >> >> WBR! >> >> > > Regards, > Oleg > _____________________________________________________________ > Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru), > Sternberg Astronomical Institute, Moscow University, Russia > Internet: oleg@sai.msu.su, http://www.sai.msu.su/~megera/ > phone: +007(495)939-16-83, +007(495)939-23-83