Многоязычный полнотекстовый поиск с Postgresql - PullRequest
1 голос
/ 02 июля 2019

Пользовательский ввод может быть на английском или итальянском языке.Данные представлены на английском и (в основном) итальянском языках.Вот мой запрос (кажется, работает), мой вопрос, если это правильный способ обработки ввода неизвестного языка.(В примере пользователь вводит слово «вино»):

    SELECT id, name
    FROM (
        SELECT p.id, p.name,
                to_tsvector('italian', p.name) || --some data are only in italian
                to_tsvector('italian', cat.category) || 
                to_tsvector((CASE WHEN de.language = 'ITA' THEN 'italian' ELSE 'english' END)::regconfig, coalesce(string_agg(de.descr, ' '))) as document 

        FROM myschema.product p
        INNER JOIN myschema.disc d ON d.id_disc = p.id_disc
        INNER JOIN myschema.disc_city dc ON dc.id_disc = d.id_disc
        INNER JOIN myschema.city c ON c.id_city = dc.id_city 
        INNER JOIN myschema.category cat ON cat.id_category = d.id_category
        INNER JOIN myschema.product_desc pd ON pd.id = p.id --One p.id to Many pd.id, a product can have multiple descriptions
        INNER JOIN myschema.descr de ON de.id_descr = pd.id_descr
        GROUP BY p.id, p.name, cat.category, de.language    
    ) p_search
--handling input 'wine' of unknown language (could be too the italian 'vino')
    WHERE p_search.document @@ to_tsquery('italian', 'wine') OR
        p_search.document @@ to_tsquery('english', 'wine');
    GROUP BY id, name

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

С PostgreSQL вы можете создать свой собственный словарь:

CREATE TEXT SEARCH DICTIONARY public.wine_dict (
TEMPLATE = pg_catalog.simple,
STOPWORDS = wine
);

файл wine.stop содержит стоп-слово вашего словаря:

wine
merlot 
carmenere
...

этот файл должен находиться в $ SHAREDIR / tsearch_data / wine.stop используйте pg_config --sharedir, чтобы найти $ SHAREDIR

, а затем создайте ПОИСКОВЫЙ СЛОВАРЬ:

 CREATE TEXT SEARCH DICTIONARY public.wine_dict (
 TEMPLATE = pg_catalog.simple,
 STOPWORDS = wine
 );

 CREATE TEXT SEARCH CONFIGURATION wine_dict(parser = default);

 ALTER TEXT SEARCH CONFIGURATION wine_dict
 ALTER MAPPING FOR asciiword, asciihword, hword_asciipart,
 word, hword, hword_part
 WITH wine_dict;

SELECT to_tsvector('wine_dict', 'The wine is good');

result: 
'good':4 'is':3 'the':1
0 голосов
/ 03 июля 2019

Вы можете использовать «простой» словарь, проверьте это:

SELECT to_tsvector('english', 'The wine is good');
SELECT to_tsvector('italian', 'The wine is good');
SELECT to_tsvector('simple', 'The wine is good');

SELECT to_tsvector('english', 'Il vino è buono');
SELECT to_tsvector('italian', 'Il vino è buono');
SELECT to_tsvector('simple', 'Il vino è buono');
...