Ошибка полнотекстового поиска в PostgreSQL

У меня есть PostgreSQL, используемый для индексации текстового содержимого. Столбец SearchVector успешно создан с использованием следующего кода

UPDATE public."DocumentFiles"
SET "SearchVector" = setweight(to_tsvector('pg_catalog.italian', coalesce("DocumentFileName", '')), 'A') 
   || setweight(to_tsvector('pg_catalog.italian', coalesce("DocumentFileDescription", '')), 'B') 
   || setweight(to_tsvector('pg_catalog.italian', coalesce("DocumentFileContentString", '')), 'B')
WHERE "DocumentFileID" = 123;

Содержимое выглядит следующим образом:

'011989':1A '5':7A 'cdp':2A 'contonu':10A 'elettr':6A 'grupp':8A 'impiant':5A 'manual':3A 'uso':4A

Но если я попытаюсь выполнить запрос, чтобы получить множественное или единственное число руководство по эксплуатации (по-итальянски: руководство равно единице, руководство равно 2 или более), произойдет сбой:

SELECT "DocumentFileID"
FROM public."DocumentFiles"
where "SearchVector"::tsvector @@ 'manuali'::tsquery;

ничего не возвращать

SELECT "DocumentFileID"
FROM public."DocumentFiles"
where "SearchVector"::tsvector @@ 'manuale'::tsquery;

ничего не возвращать

Он возвращает запись только в том случае, если я пишу именно то, что написано в поле searchvector:

SELECT "DocumentFileID"
FROM public."DocumentFiles"
where "SearchVector"::tsvector @@ 'manual'::tsquery;

Что с этим не так?

Скорее всего, это не связано с вашей проблемой: но зачем приведение ::tsvector, если столбец уже tsvector? У меня нет большого опыта работы с FTS, но разве вам не нужно также предоставлять язык для tsquery? @@ to_tsquery('pg_catalog.italian', 'manuale')

a_horse_with_no_name 06.05.2022 14:59

@a_horse_with_no_name, это тот же синтаксис. Я получаю то же поведение с "... где "SearchVector" @@ to_tsquery('pg_catalog.italian','manuale');"

Giox 06.05.2022 15:02
'manual' contains 'manuali' неверно, так почему вы ожидаете совпадения?
user18098820 06.05.2022 15:04

@kendle, потому что «manuali» — это множественное число слова «manuale». Поэтому он должен возвращать результат для обоих из них

Giox 06.05.2022 15:12
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, вероятно, в том, что параметр default_text_search_configuration не установлен в italian, поэтому используется другой алгоритм стемминга.

Будьте откровенны и используйте to_tsquery('italian', 'manuali'), а не 'manuali'::tsquery.

Другие вопросы по теме