Задать вопрос
UmbrellaCoders
@UmbrellaCoders
PHP, JS Developer

Как работает full text search в postgresql, почему не выбирает НЕполное вхождение?

Есть два запроса:

SELECT city, country, title, tagline, description, tags, ts_rank_cd(fts, query) AS rank
FROM trips, plainto_tsquery('ru','гауди') query
WHERE query @@ fts
ORDER BY rank DESC
LIMIT 100;


Результат 30 строк допустим.
Следующий:

SELECT city, country, title, tagline, description, tags, ts_rank_cd(fts, query) AS rank
FROM trips, plainto_tsquery('ru','тайны гауди') query
WHERE query @@ fts
ORDER BY rank DESC
LIMIT 100;


результат 5 строк, но почему? я хочу те-же 30 строк что и в первом запросе, но строки по "тайны гауди" что-бы были выше.

индекс RUM, словари есть.

tsvector поле создаю так

UPDATE trips SET fts = (setweight(to_tsvector('ru',city), 'A')||
          setweight(to_tsvector('ru',country), 'B')||
          setweight(to_tsvector('ru',title), 'C')||
          setweight(to_tsvector('ru',tagline), 'C')||
          setweight(to_tsvector('ru',description), 'C')||
          setweight(to_tsvector('ru',tags), 'C'));


Индекс так:
CREATE INDEX rumidx ON trips USING rum (fts rum_tsvector_ops);


как сделать, что-бы брал документы по частичному совпадению в т.ч.?

Спасибо!
  • Вопрос задан
  • 1338 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
select_artur
@select_artur
C разработчик
Попробуйте выполнить такой запрос:
SELECT city, country, title, tagline, description, tags
FROM trips
WHERE fts @@ plainto_tsquery('ru','гауди')
ORDER BY ts_rank_cd(fts, plainto_tsquery('ru','тайны гауди')) DESC
LIMIT 100;

Это для GIN. Для RUM можно выполнить такой запрос:
SELECT city, country, title, tagline, description, tags
FROM trips
WHERE fts @@ plainto_tsquery('ru','гауди')
ORDER BY fts <=> plainto_tsquery('ru','тайны гауди')
LIMIT 100;
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
лень разбирать опции, но чудес чтобы движок понял что "вот эти неполные доки ранжируй ниже этих полных" не бывает

или строишь пересечение ( так проще всего + мультипоточность), или меняешь структуру данных где вес на полные добавится за счет присутствия в каком нибудь tagline
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы