5

Я разрабатываю простой сайт статей на бразильском португальском языке. Функция поиска основана на полнотекстовом поиске, но не возвращает ожидаемых результатов.Не удается получить правильные результаты после 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». Но я все еще не могу понять, почему он не возвращает строку, содержащую указанную статью.

Может кто-нибудь принести свет в этот вопрос?

+0

Играли с различными конфигурациями, доступными на сервере. Я думаю, что это проблема из доступных словарей и словосочетаний.Кто-нибудь знает, как сопоставить верхние символы (например, áéóôú) с векторами? – Dave

ответ

4

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

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

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

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

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

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

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

Thx для ответа. Да, я понял, что основной словарь основан на английском. И португальцы считают словари, несмотря на существующие, отстой. Я мог бы достичь наилучших результатов, используя конфигурацию SIMPLE. Основная проблема заключается в использовании специальных персонажей, таких как, например, в основном, на португальском языке. И некоторые лексемы не разбираются в порядке, но большинство лексем разбираются правильно, поэтому на данный момент он частично удовлетворяет мои потребности. – Dave

+0

@Dave - я не пробовал это с любым другим языком, кроме английского, но вы всегда можете использовать словарь ispell с отступлением на снежный комбайн. Португальские словари доступны онлайн: http://lasr.cs.ucla.edu/geoff/ispell-dictionaries.html#Portuguese-dicts – thetaiko

+0

Thx для быстрого ответа, но я хотел бы изменить эти настройки на моем хосте. К сожалению, изменение свойств dict, резервных копий, файлов и т. Д. Для меня не является вариантом для этого конкретного сервера. Но опять же, thx для подсказок. – Dave

1

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

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

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

Так я получаю:

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

Вам нужно:

CREATE EXTENSION unaccent; 

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

Смежные вопросы