Синоним СЛОВАРЬ для `простого` языка не работает - PullRequest
0 голосов
/ 05 февраля 2020

Я полагаю, что мы можем использовать этот старый рецепт и заменить только язык german на язык simple (то есть "без языка") ... Но он не работает.

  CREATE TEXT SEARCH DICTIONARY my_synonym (
     TEMPLATE = synonym,
     SYNONYMS = synonym_sample
     -- default /usr/share/postgresql/12/tsearch_data/synonym_sample.syn
  );
  CREATE TEXT SEARCH CONFIGURATION my_synonym(COPY='simple'); -- need it??
  ALTER TEXT SEARCH CONFIGURATION my_synonym
     ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part
     WITH my_synonym   -- make sense??
  ;

 SELECT to_tsvector('my_synonym', 'Postgresql') 
      @@ to_tsquery('my_synonym', 'Postgresql'); -- true


    SELECT to_tsvector('my_synonym', 'Postgresql') 
         @@ to_tsquery('my_synonym', 'pgsql'); -- false. NOTICE:  
    -- text-search query contains only stop words or doesn't contain lexemes, ignored
    SELECT to_tsvector('my_synonym', 'Postgresql pgsql') 
         @@ to_tsquery('my_synonym', 'pgsql'); -- false. Same NOTICE.

synonym_sample.syn описано в действующем руководстве 12.6.3. Словарь синонимов раздел. Он преобразует аббревиатуру "pg sql" в слово "postgres" ... Так что много проблем

  1. сбой, не работает, не переводится "pg sql" в "postgres".
  2. игнорируется "pg sql" (!)
  3. генерирует УВЕДОМЛЕНИЕ, которое не имеет смысла

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Как только вы закончите делать замены синонимов, вам нужно передать полученные лексемы стеммеру. Это происходит в обоих примерах, на которые вы ссылаетесь, но не происходит в вашем примере. Вы можете использовать «простой» в качестве фиктивного стеммера, который просто передает свой вывод без какого-либо фактического стемминга.

ALTER TEXT SEARCH CONFIGURATION my_synonym
     ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, word, hword, hword_part
     WITH my_synonym, simple;
0 голосов
/ 06 февраля 2020

Я согласен с ответом @jjanes. Вам необходимо передать результат вашего словаря synonym в словарь simple.

Вот результаты, если вы не передали результат в словарь simple:

SELECT to_tsvector('my_synonym', 'Postgresql'), to_tsquery('my_synonym', 'pgsql');
 to_tsvector | to_tsquery
-------------+------------
 'pgsql':1   |

А вот результаты, если вы передадите его:

SELECT to_tsvector('my_synonym', 'Postgresql'), to_tsquery('my_synonym', 'pgsql');
 to_tsvector | to_tsquery
-------------+------------
 'pgsql':1   | 'pgsql'

Но есть другой подход на тот случай, если вы не хотите использовать другие словари, кроме synonym , Вы можете использовать dict_xsyn модуль contrib. Вот его документация: https://www.postgresql.org/docs/current/dict-xsyn.html

Просто сделайте следующее:

CREATE EXTENSION dict_xsyn;
ALTER TEXT SEARCH DICTIONARY xsyn(
    RULES='xsyn_sample', KEEPORIG=false, MATCHSYNONYMS=true);
CREATE TEXT SEARCH CONFIGURATION xsyn(COPY='simple');
ALTER TEXT SEARCH CONFIGURATION xsyn
    ALTER MAPPING FOR
        asciiword, asciihword, hword_asciipart, word, hword, hword_part
    WITH xsyn;

Здесь я не использую словарь simple. Создание расширения dict_xsyn также создает словарь xsyn. Но это не создает конфигурацию, поэтому вам нужно создать соответствующую конфигурацию.

Вам также необходимо настроить словарь xsyn с соответствующими параметрами или создать новый. Мой xsyn_sample.rules файл:

supernova sn sne 1987a
postgresql pgsql

И вот результаты:

SELECT to_tsvector('xsyn', 'Postgresql'), to_tsquery('xsyn', 'pgsql');
 to_tsvector | to_tsquery
-------------+------------
 'pgsql':1   | 'pgsql'
SELECT to_tsvector('xsyn', 'Postgresql') @@ to_tsquery('xsyn', 'pgsql');
 ?column?
----------
 t
...