Не удается получить правильные результаты полнотекстового поиска postgre - PullRequest
5 голосов
/ 14 октября 2010

Я разрабатываю простой веб-сайт для статей на бразильском португальском языке.Функция поиска основана на полнотекстовом поиске, но она не возвращает ожидаемых результатов.

Я сделал это на 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');

Да, я намерен использовать простое взвешивание при поиске.Сделал индекс для ускорения, триггер, чтобы я мог вставлять и обновлять, не беспокоясь о переделке индекса и т. Д.

Ну, насколько я понимаю, все нормально.Но результаты не являются.Простой пример.

Допустим, у меня есть "... banco de dados ... no banco ..." как одно содержание статьи.Когда я делаю:

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('banco de dados') @@ artigosts;

Возвращает пустой набор.Я проверил столбец ts_vector и увидел предикаты 'banc' и 'dad'.Но я до сих пор не могу понять, почему он не возвращает строку, содержащую упомянутую статью.

Может кто-то пролить свет на этот вопрос?

Ответы [ 2 ]

5 голосов
/ 18 октября 2010

Причина этого, вероятно, в том, что ваш словарь по умолчанию установлен на английский. Попробуйте следующие запросы, чтобы определить, так ли это на самом деле.

SELECT * FROM ts_debug('banco de dados');

Этот запрос покажет, как словарь анализирует вашу поисковую фразу. Он должен содержать лексемы "banco", "de" и "dado". То, что вы на самом деле ищете, не будет присутствовать в индексе, и вы получите 0 результатов.

Теперь попробуйте это:

SELECT * FROM ts_debug('portuguese', 'banco de dados');

Он должен возвращать лексемы, которые существуют в индексе "banc" и "dad". Если это так, то вы можете просто изменить свой поисковый запрос, чтобы получить соответствующий результат.

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('portuguese', 'banco de dados') @@ artigosts;
1 голос
/ 10 декабря 2014

Возможно, вам уже поздно. И мне не хватает репутации, чтобы добавить простой комментарий ...

Что касается специальных символов, я отменяю их, прежде чем преобразовать в tsvector.

SELECT to_tsvector('simple',unaccent('banco de dados áéóíúçãõ'))

Итак, я получаю:

"'aeoiucao':4 'banco':1 'dados':3 'de':2"

Вам необходимо:

CREATE EXTENSION unaccent;

... как пользователь postgres. И конечно же, вы должны отменить свой запрос также

...