Полнотекстовый поиск в PostgreSQL не может найти "andy" - PullRequest
0 голосов
/ 02 октября 2018

У меня есть этот запрос PostgreSQL:

SELECT d.user_id, display_name, avatar_url
FROM user_directory_search
WHERE
user_id like '@and%';

Я получаю следующие результаты:

                    user_id             | display_name | avatar_url
----------------------------------------+--------------+------------
 @andy.huang:synapse.siliconmotion.com  |              |
 @andy.zhao:synapse.siliconmotion.com   | Andy.zhao    |
 @andy.yao:synapse.siliconmotion.com    |              |
 @andy.zou:synapse.siliconmotion.com    |              |
 @andy.xie:synapse.siliconmotion.com    |              |
 @andy.chang:synapse.siliconmotion.com  | andy.chang   |
 @andy.chuang:synapse.siliconmotion.com | andy.chuang  |
 @andy.hsiao:synapse.siliconmotion.com  |              |
(8 rows)

Но когда я использую команду:

SELECT d.user_id, display_name, avatar_url
FROM user_directory_search
WHERE
vector @@ to_tsquery('english', '(andy:* | andy)');

Я получилничего:

 user_id | display_name | avatar_url
---------+--------------+------------
(0 rows)

Кто-нибудь знает причину?

1 Ответ

0 голосов
/ 02 октября 2018

Проблема в том, что полнотекстовый парсер анализирует эти строки как имена хостов:

SELECT alias, description, token, lexemes
FROM ts_debug('english', '@andy.huang:synapse.siliconmotion.com')
WHERE alias <> 'blank';

 alias | description |           token           |           lexemes           
-------+-------------+---------------------------+-----------------------------
 host  | Host        | andy.huang                | {andy.huang}
 host  | Host        | synapse.siliconmotion.com | {synapse.siliconmotion.com}
(2 rows)

Вы можете заменить периоды сбоя пробелами при индексации:

SELECT alias, description, token, lexemes
FROM ts_debug('english',
              translate('@andy.huang:synapse.siliconmotion.com', '.', ' '))
WHERE alias <> 'blank';

   alias   |   description   |     token     |   lexemes    
-----------+-----------------+---------------+--------------
 asciiword | Word, all ASCII | andy          | {andi}
 asciiword | Word, all ASCII | huang         | {huang}
 asciiword | Word, all ASCII | synapse       | {synaps}
 asciiword | Word, all ASCII | siliconmotion | {siliconmot}
 asciiword | Word, all ASCII | com           | {com}
(5 rows)

Но я быиспользуйте настройку полнотекстового поиска simple на вашем месте.Или вы хотите использовать stemming (сравните "лексемы" и "лексемы" выше)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...