2016-07-22 3 views
2

У меня получился странный результат поиска выражения типа pro-physik.de с tsquery.Странный поиск результата с to_tsquery под Postgresql

Если я прошу pro-physik:* от tsquery, я хочу получить все записи, начиная с pro-physik. К сожалению, эти записи с pro-physik.de отсутствуют.

Вот 2 примера, чтобы продемонстрировать эту проблему:

Запрос 1:

select 
    to_tsvector('simple', 'pro-physik.de') @@ 
    to_tsquery('simple', 'pro-physik:*') = true 

Результат 1: false (должно быть true)

Запрос 2:

select 
    to_tsvector('simple', 'pro-physik.de') @@ 
    to_tsquery('simple', 'pro-p:*') = true 

Результат 2: true

Есть ли у кого-нибудь идеи, как я мог бы решить эту проблему?

ответ

2

Ядро проблемы заключается в том, что анализатор будет анализировать pro-physik.de как имя хоста:

SELECT alias, token FROM ts_debug('simple', 'pro-physik.de'); 

alias |  token 
-------+--------------- 
host | pro-physik.de 
(1 row) 

Сравните это:

SELECT alias, token FROM ts_debug('simple', 'pro-physik-de'); 
     alias  |  token 
-----------------+--------------- 
asciihword  | pro-physik-de 
hword_asciipart | pro 
blank   | - 
hword_asciipart | physik 
blank   | - 
hword_asciipart | de 
(6 rows) 

Теперь pro-physik и pro-p являются не имена хостов, так что вы получите

SELECT to_tsquery('simple', 'pro-physik:*'); 
       to_tsquery 
--------------------------------------- 
'pro-physik':* & 'pro':* & 'physik':* 
(1 row) 

SELECT to_tsquery('simple', 'pro-p:*'); 
     to_tsquery 
----------------------------- 
'pro-p':* & 'pro':* & 'p':* 
(1 row) 

Первый tsquery не будет соответствовать, потому что physik не является префиксом pro-physik.de, а второй будет соответствовать, потому что pro-p, pre и p все три являются префиксами.

В качестве обходного, используйте полнотекстовый поиск, как это:

select 
    to_tsvector('simple', replace('pro-physik.de', '.', ' ')) @@ 
    to_tsquery('simple', replace('pro-physik:*', '.', ' ')) 
+0

Большое спасибо, ваш ответ был весьма полезным. –

+0

Основная проблема - это не точка, а поведение ts-parser, чтобы избежать разделения имен хостов. То же самое и с адресами электронной почты: –

+0

У вас или у кого-либо еще есть идея, как настроить полнотекстовый поиск, игнорируя имена хостов, адреса электронной почты, например? –

Смежные вопросы