Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
ERROR: ts_stat query must return one tsvector column
А что не так со словом "формирован"? Ввели "фо" — дополнился "формирован", всё же правильно, разве нет?
tasks=# SELECT * FROM ts_stat('SELECT fti_txt FROM texts') ORDER BY nentry DESC, ndoc DESC LIMIT 10;
word | ndoc | nentry
--------+------+--------
сдела | 1286 | 1507
сервер | 628 | 830
сегодн | 667 | 725
дан | 573 | 723
эт | 579 | 689
нов | 525 | 629
дела | 524 | 595
работ | 522 | 589
файл | 382 | 544
1 | 256 | 538
(10 rows)
У всей системы есть один крупный недостаток...
… слова в поле типа tsvector записываются после стемминга
SELECT
token
, dictionary
, lexemes
FROM ts_debug('Проверяю ксерокс searches ктулху')
WHERE lexemes IS NOT NULL
;
token | dictionary | lexemes
----------+-----------------+-------------
Проверяю | dict_ispell_rus | {проверять}
ксерокс | thesaurus_tpro | {xerox}
searches | dict_ispell_eng | {search}
ктулху | russian_stem | {ктулх}
SELECT to_tsvector('клапан запорный корозийностойкий') @@ plainto_tsquery('вентиль нержавеющий'); -- TRUE
SELECT title FROM company WHERE LOWER(title) ~ 'дизель' ORDER BY 1;
АВТОДИЗЕЛЬ ПЛЮС
АВТОДИЗЕЛЬЗАПЧАСТЬ
Автодизель Актобе
Дизель-Резерв
ДизельГрупп
ДизельДеталь
...
Ярдизель Сервис
CREATE INDEX ON company USING gin (LOWER(title) gin_trgm_ops);
EXPLAIN SELECT title FROM company WHERE LOWER(title) ~ 'дизель' ORDER BY 1;
...
Bitmap Index Scan on company_lower_title_trgm
Index Cond: (lower(title) ~ 'дизель'::text)
@shk1r: Необходимо обязательно минимум одно полное слово для FTS?
SELECT title FROM company WHERE tsv @@ to_tsquery('дизельн:*');
Балтийская дизельная компания
Дизельные Технологии
...
Саратовдизельаппарат
Сибирский дизельный центр
tsv::TSVECTOR...
Bitmap Index Scan on company_tsv (cost=0.00..496.22 rows=28 width=0)
Index Cond: (tsv @@ to_tsquery('дизельн:*'::text))
Пример реализации autocomplete с использованием FTS движка PostgreSQL tsearch2