Чи всі запити повинні бути в словнику?
Ні. Тому що лише індекси слова (відповідно до використовуваної конфігурації пошуку тексту ) знаходяться в індексі для початку. Але ще важливіше:
Ні . Тому що, крім цього, повнотекстовий пошук також може відповідати префіксам :
Це спрацювало б:
SELECT id, subject
FROM mailboxes
WHERE tsv @@ to_tsquery('simple', 'avail:*')
ORDER BY id DESC;
Примітка 3 речі:
Використовуйте to_tsquery()
не plainto_tsquery()
в цьому випадку тому, що ( цитуючи посібник ):
... plainto_tsquery
не впізнає tsquery
операторів, міток ваги або міток збігу префіксів у своєму введенні
Використовуйте 'simple'
конфігурацію пошуку тексту, щоб генерувати, tsquery
оскільки ви, очевидно, хочете прийняти слово "avail" таким, яке є, і не застосовувати випливає.
Додайте, :*
щоб зробити це префіксом пошуку, тобто знайти всі лексеми, що починаються з 'avail'.
Важливо: Це пошук префікса у лексемах (слова стебла) у документі. Збіг регулярного вираження без символів ( content ~* 'avail'
) не зовсім такий! Останній не залишається закріпленим (до початку лексеми), і він також знайде "FOOavail" тощо.
Незрозуміло, чи хочете ви, щоб поведінка, викладена у вашому запиті, або еквівалент доданого регулярного виразу. Триграм-індекси ( pg_trgm
), як @Evan вже запропоновано, є правильним інструментом для цього. На dba.SE є багато пов’язаних питань, спробуйте знайти .
Огляд:
Демо
SELECT *
FROM (
VALUES
('Zend has no framework')
, ('Zend Framework')
) sub(t), to_tsvector(t) AS tsv
WHERE tsv @@ to_tsquery('zend <-> fram:*');
id | t | tsv
----+----------------+------------------------
2 | Zend Framework | 'framework':2 'zend':1
Нещодавній відповідь (глава Інший підхід до оптимізації пошуку ):
Електронні листи?
Оскільки ви згадали електронні листи, пам’ятайте, що аналізатор пошуку тексту визначає електронні листи та не розділяє їх на окремі слова / лексеми. Поміркуйте:
SELECT ts_debug('english', 'xangr@some.domain.com')
(email,"Email address",xangr@some.domain.com,{simple},simple,{xangr@some.domain.com})
Я замінив би розділювачі @
та .
у ваших електронних листах пробілом ( ' '
), щоб індексувати слова, що містяться.
Крім того, оскільки ви маєте справу з іменами в електронних листах, а не з англійськими (чи якимись іншими мовами) словами , я б використовував 'simple'
конфігурацію пошуку тексту, щоб відключити вихідні та інші особливості мови :
Створіть ts_vector
стовпець за допомогою:
SELECT to_tsvector('simple', translate('joe.xangr@some.domain.com', '@.', ' ')) AS tsv;
:*
документально зафіксовано, і 2) чи не слід згадувати про складання зto_tsvector('simple'..)
рук в руки з інструкціями про те, що подальший запит цього телевізора потребуватиме «простої» конфігурації також для tsquery? Я думаю, ви повинні уточнити наслідки відключення, що виникають із цвектора / tsquery.