Несколько совпадений словаря синонимов в полнотекстовом поиске PostgreSQL - PullRequest
4 голосов
/ 30 июля 2009

Я пытаюсь выполнить полнотекстовый поиск в PostgreSQL 8.3. Это сработало великолепно, поэтому я добавил соответствие синонимов (например, 'bob' == 'robert'), используя словарь синонимов. Это тоже прекрасно работает. Но я заметил, что оно, по-видимому, позволяет слову иметь только синоним один . То есть «al» не может быть «albert» и «allen».

Это правильно? Есть ли способ иметь несколько словарных совпадений в словаре синонимов PostgreSQL?

Для справки, вот мой пример файла словаря:

bob    robert
bobby  robert
al     alan
al     albert
al     allen

И SQL, который создает конфигурацию полнотекстового поиска:

CREATE TEXT SEARCH DICTIONARY nickname (TEMPLATE = synonym, SYNONYMS = nickname);
CREATE TEXT SEARCH CONFIGURATION dxp_name (COPY = simple);
ALTER TEXT SEARCH CONFIGURATION dxp_name ALTER MAPPING FOR asciiword WITH nickname, simple;

Что я делаю не так? Спасибо!

Ответы [ 3 ]

4 голосов
/ 31 июля 2009

Это ограничение в том, как работают синонимы. То, что вы можете сделать, это перевернуть его так:

bob    robert
bobby  robert
alan   al
albert al
allen  al

Он должен давать тот же конечный результат, а именно: поиск любого из них будет совпадать.

2 голосов
/ 04 мая 2010

Словарь должен определять функциональные отношения между словами и лексемами, иначе он не будет знать, какое слово возвращать при лексизировании. В вашем примере al отображается на три различных значения, определяя многозначную функцию, а функция lexize не знает, что возвращать. Как показывает Магнус, вы можете лексизировать от собственных имен alan, albert, allen до псевдонима al.

Помните, однако, что смысл словаря FTS состоит не в том, чтобы выполнять преобразования как таковые, а в том, чтобы обеспечить эффективную индексацию по семантически релевантным словам. Это означает, что лексема не должна напоминать исходную запись в каком-либо языковом смысле. Хотя вы правы в том, что отношения «многие ко многим» невозможно определить, вам это действительно нужно? Например, чтобы разрешить ваш vin пример:

vin        vin
vincent    vin
vincenzo   vin
vinnie     vin

но вы также можете сделать это:

vin        grob
vincent    grob
vincenzo   grob
vinnie     grob

и получите тот же эффект (хотя, почему вы хотите, это другая история).

Таким образом, если вы проанализируете документ, скажем, с 11 версиями имени Vincent, тогда функция to_tsvector вернет vin:11 в первом случае и grob:11 во втором.

1 голос
/ 18 сентября 2009

В документации 8.4 говорится о словаре замены синонимов, может быть, это будет полезно?

http://www.postgresql.org/docs/8.4/interactive/dict-xsyn.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...