Как добавить соответствие префикса в tsquery в PostgreSQL - PullRequest
0 голосов
/ 07 февраля 2019

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

Дляс этой целью подстановочный знак «*» должен быть присоединен к последней лексеме tsquery.Например, если пользователь вводит "The fat ra", запрос должен быть 'fat' & 'ra':*.

Если я добавляю whildcart к входной строке и анализирую ее с помощью функции plainto_tsquery, тогда whildcard удаляется plainto_tsquery("The fat ra" || ":*") => 'fat' & 'ra'.

Создание запроса вручную с помощью функции to_tsquery требует много модификаций строки (таких как пробелы и другие специальные символы, замените пробелы символом амперсанда), чтобы функция приняла его.

Есть ли более простой способ сделать это?

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете сделать последнюю лексему в tsquery совпадением префикса, приведя ее к строке, добавив ': *', а затем приведя обратно к tsquery:

=> SELECT ((to_tsquery('foo <-> bar')::text || ':*')::tsquery);
      tsquery      
-------------------
 'foo' <-> 'bar':*

Для вашего варианта использования выВы захотите использовать <-> вместо &, чтобы слова были рядом друг с другом.Вот демонстрация того, как они отличаются:

=> SELECT 'foo bar baz' @@ tsquery('foo & baz');
 ?column? 
----------
 t
(1 row)

=> SELECT 'foo bar baz' @@ tsquery('foo <-> baz');
 ?column? 
----------
 f
(1 row)

phraseto_tsquery позволяет легко указать много слов, которые должны быть рядом друг с другом:

=> SELECT phraseto_tsquery('foo baz');
 phraseto_tsquery 
------------------
 'foo' <-> 'baz'

Поместить еговсе вместе:

=> SELECT (phraseto_tsquery('The fat ra')::text || ':*')::tsquery;
     tsquery      
------------------
 'fat' <-> 'ra':*

В зависимости от ваших потребностей, более простым способом может быть создание запроса непосредственно со строкой, а затем приведение:

=> SELECT $$'fat' <-> 'ra':*$$::tsquery;
     tsquery      
------------------
 'fat' <-> 'ra':*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...