Подтвердить что ты не робот

Удаление специальных символов в to_tsquery

Как вы выделяете специальные символы в строке, переданной в to_tsquery? Например, такой запрос:

select to_tsquery('AT&T');

Выдает:

NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored

 to_tsquery 
------------

(1 row)

Изменить: я также заметил, что в to_tsvector есть одна и та же проблема.

4b9b3361

Ответ 1

Если вы хотите, чтобы "AT & T" рассматривался как поисковое слово, вам понадобятся некоторые настраиваемые компоненты, потому что парсер по умолчанию разбивает его на два слова:

[email protected]@[local] =# select * from ts_parse('default', 'AT&T');
 tokid | token 
-------+-------
     1 | AT
    12 | &
     1 | T
(3 rows)
[email protected]@[local] =# select * from ts_debug('simple', 'AT&T');
   alias   |   description   | token | dictionaries | dictionary | lexemes 
-----------+-----------------+-------+--------------+------------+---------
 asciiword | Word, all ASCII | AT    | {simple}     | simple     | {at}
 blank     | Space symbols   | &     | {}           |            | 
 asciiword | Word, all ASCII | T     | {simple}     | simple     | {t}
(3 rows)

Как вы можете видеть из документации для CREATE TEXT PARSER, это не очень тривиально, так как синтаксический анализатор, похоже, должен быть C-функцией.

Вы можете найти это сообщение о том, что кто-то получает "underscore_word", чтобы быть признанным в качестве одного токена полезным: http://postgresql.1045698.n5.nabble.com/Configuring-Text-Search-parser-td2846645.html

Ответ 2

Простым решением является создание tsquery следующим образом:

select $$'AT&T'$$::tsquery;

Вы можете создавать более сложные запросы:

select $$'AT&T' & Phone | '|Bang!'$$::tsquery;

Подробнее см. текстовый поиск docs.

Ответ 3

Я нашел этот комментарий очень полезным, который использует функцию plainto_tsquery('AT&T) fooobar.com/info/484971/...