Я разрабатываю простой сайт статей на бразильском португальском языке. Функция поиска основана на полнотекстовом поиске, но не возвращает ожидаемых результатов.Не удается получить правильные результаты после postgre полнотекстового поиска
Я сделал это на postgresql. Вот упрощенная таблица:
Artigos
-id
-title -- article title
-intro -- article introduction
-content -- article body
-publishdate -- date of launch
-artigosts -- this will work as our fts index.
После создания таблицы, я побежал:
UPDATE artigos SET artigosts =
setweight(to_tsvector('pg_catalog.portuguese', coalesce(title,'')), 'A') ||
setweight(to_tsvector('pg_catalog.portuguese', coalesce(intro,'')), 'B') ||
setweight(to_tsvector('pg_catalog.portuguese', coalesce(content,'')), 'C');
CREATE INDEX artigosts_idx ON artigos USING gist (artigosts);
CREATE TRIGGER artigosts_tg
BEFORE INSERT OR UPDATE ON artigos
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger('artigosts', 'pg_catalog.portuguese', 'title', 'intro', 'content');
Да, я намерен использовать простую weightning на поиски. Сделал индекс для ускорения, триггер, поэтому я могу вставлять и обновлять, не беспокоясь о переделке индекса и так далее.
Ну, в моем понимании, все хорошо. Но результатов нет. Простой пример.
Предположим, у меня есть «... banco de dados ... no banco ...» как одно содержание статьи. Когда я это сделаю:
SELECT title, intro, content FROM artigos WHERE plainto_tsquery('banco de dados') @@ artigosts;
Он возвращает пустой комплект. Я проверил столбец ts_vector и увидел предикаты «banc» и «dad». Но я все еще не могу понять, почему он не возвращает строку, содержащую указанную статью.
Может кто-нибудь принести свет в этот вопрос?
Играли с различными конфигурациями, доступными на сервере. Я думаю, что это проблема из доступных словарей и словосочетаний.Кто-нибудь знает, как сопоставить верхние символы (например, áéóôú) с векторами? – Dave