dict_xsyn

Модуль dict_xsyn (Extended Synonym Dictionary, расширенный словарь синонимов) представляет собой пример дополнительного шаблона словаря для полнотекстового поиска. Этот тип словаря заменяет слова группами их синонимов, тем самым позволяя находить слово по одному из его синонимов.


Конфигурация

Словарь dict_xsyn принимает следующие параметры:

  • Параметр matchorig определяет, будет ли словарь принимать исходное слово. Значение по умолчанию — true (включен).

  • Параметр matchsynonyms определяет, будет ли словарь принимать синонимы. Значение по умолчанию — false (выключен).

  • Параметр keeporig определяет, будет ли в вывод словаря включаться исходное слово. Значение по умолчанию — true (включен).

  • Параметр keepsynonyms определяет, будут ли в вывод словаря включаться синонимы. Значение по умолчанию — true (включен).

  • Параметр rules задает базовое имя файла, содержащего список синонимов. Этот файл должен храниться в каталоге $SHAREDIR/tsearch_data/ (где под $SHAREDIR подразумевается каталог с общими данными установки QHB). Имя файла должно заканчиваться расширением .rules (которое не нужно указывать в параметре rules).

Файл правил имеет следующий формат:

  • Каждая строка представляет группу синонимов для одного слова, которое задается первым в этой строке. Синонимы разделяются пробелами, поэтому строка выглядит так:

    слово син1 син2 син3
    
  • Символ решетки (#) является знаком-разграничителем для комментария. Он может находиться в любом месте строки. Следующая за ним часть строки будет пропущена.

Пример словаря можно найти в файле xsyn_sample.rules, устанавливаемом в $SHAREDIR/tsearch_data/.


Применение

При установке расширения dict_xsyn в базе создается шаблон текстового поиска xsyn_template и словарь xsyn на его основе, с параметрами по умолчанию. Эти параметры можно изменить, например так:

mydb# ALTER TEXT SEARCH DICTIONARY xsyn (RULES='my_rules', KEEPORIG=false);
ALTER TEXT SEARCH DICTIONARY

или создать новые словари на основе этого шаблона.

Протестировать этот словарь можно так:

mydb=# SELECT ts_lexize('xsyn', 'word');
      ts_lexize
-----------------------
 {syn1,syn2,syn3}

mydb# ALTER TEXT SEARCH DICTIONARY xsyn (RULES='my_rules', KEEPORIG=true);
ALTER TEXT SEARCH DICTIONARY

mydb=# SELECT ts_lexize('xsyn', 'word');
      ts_lexize
-----------------------
 {word,syn1,syn2,syn3}

mydb# ALTER TEXT SEARCH DICTIONARY xsyn (RULES='my_rules', KEEPORIG=false, MATCHSYNONYMS=true);
ALTER TEXT SEARCH DICTIONARY

mydb=# SELECT ts_lexize('xsyn', 'syn1');
      ts_lexize
-----------------------
 {syn1,syn2,syn3}

mydb# ALTER TEXT SEARCH DICTIONARY xsyn (RULES='my_rules', KEEPORIG=true, MATCHORIG=false, KEEPSYNONYMS=false);
ALTER TEXT SEARCH DICTIONARY

mydb=# SELECT ts_lexize('xsyn', 'syn1');
      ts_lexize
-----------------------
 {word}

Для практического же применения его нужно включить в конфигурацию текстового поиска, как описано в главе Полнотекстовый поиск. Это может выглядеть примерно так:

ALTER TEXT SEARCH CONFIGURATION english
    ALTER MAPPING FOR word, asciiword WITH xsyn, english_stem;