Postgres как для полнотекстового поиска - PullRequest
0 голосов
/ 17 апреля 2020

Я пытался создать запрос, чтобы найти имя other в моей базе данных sql. У меня есть базовый c подобный поиск, и я хотел бы вместо этого использовать полнотекстовый поиск.

Лайк-запрос

SELECT g.*, COUNT(*) OVER() AS total 
FROM group AS g 
WHERE UPPER(g.name) LIKE UPPER('oth%')

Полнотекстовый запрос

SELECT g.*, COUNT(*) OVER() AS total 
FROM group AS g 
WHERE to_tsvector(g.name) @@ to_tsquery('oth:*') 

Похоже, что мой полный текст возвращает 0, в отличие от моего поиска аналогичного. Почему это так, когда кажется, что оба запроса выполняют одинаковый поиск

1 Ответ

1 голос
/ 17 апреля 2020

Похоже, что "другое" находится в списке стоп-слов по умолчанию на английском языке sh. Я проверил с PostgreSQL 12 на уровне Linux:

$ grep other /usr/pgsql-12/share/tsearch_data/english.stop 
other

В базе данных:

postgres=# select to_tsvector('french','other');
 to_tsvector 
-------------
 'other':1
(1 row)

postgres=# select to_tsvector('english','other');
 to_tsvector 
-------------

(1 row)

postgres=# select to_tsvector('english','others');
 to_tsvector 
-------------
 'other':1
(1 row)

postgres=# select to_tsvector('english','another');
 to_tsvector 
-------------
 'anoth':1
(1 row)

Попробуйте 'другой'.

...