2017-02-15 3 views
1

У меня есть схема, как это (упрощенный):PostgreSQL полнотекстового поиска и дающие странные результаты

CREATE TABLE users (
    id SERIAL PRIMARY KEY, 
    name NOT NULL 
); 
CREATE INDEX users_idx 
ON users 
USING GIN (to_tsvector('finnish', name)); 

Но я получаю совершенно недопустимые результаты с моими запросами:

# select name from users where to_tsvector('finnish', name) @@ to_tsquery('lemmin'); 
name 
------ 
(0 rows) 

# select name from users where to_tsvector('finnish', name) @@ to_tsquery('lemmink'); 
     name          
-------------------- 
Riitta ja Lemminki 
Riitta ja Lemminki 
(2 rows) 

# select name from users where name ilike 'lemmink%'; 
     name     
---------------------- 
Lemminkäinen Matilda 
Lemminkäinen Matias 
Lemminkäinen Kyösti 
Lemminkäinen Tuomas 
(4 rows) 

Другой пример:

# select name from users where to_tsvector('finnish', name) @@ to_tsquery('partu'); 
    name    
---------- 
Partuuna 
(1 row) 

# select name from users where to_tsvector('finnish', name) @@ to_tsquery('partur'); 
     name          
------------------------ 
Parturi-Kampaamo Raija 
Parturi-Kampaamo Siema 
(2 rows) 

Я ожидал получить два нижних результата по обоим запросам ...

Используя следующую версию:

psql (9.4.6, server 9.5.2) 
WARNING: psql major version 9.4, server major version 9.5. 
     Some psql features might not work. 
+0

Если 'finnish' не ваша по умолчанию FTS со nfig, вы должны дать ''финский' '(если вы хотите использовать это) в качестве первого параметра как для' to_tsvector() 'и' to_tsquery() '. - Я точно не знаю, что происходит, когда запрос токенизуется иначе, чем вектор (документ), но я не думаю, что что-то хорошее может придумать эту настройку. – pozs

+1

Кроме того, для чистого совпадения префикса (где 'lemmin' или' lemmink' не является полным стеблем), вы должны использовать 'to_tsquery ('finnish', 'lemmin: *')' – pozs

+0

Также (снова :)), в результате чего имена людей на самом деле не является одной из сильных сторон FTS. – pozs

ответ

-1

Я не говорю на финском, но, кажется, ожидаемый результат. FTS ищет лексем, а не для частей слов, например, do не lexemme для dog, но dog для dogs:

t=# select to_tsvector('english', 'Dogs eats bone') @@ to_tsquery('do'); 
NOTICE: text-search query contains only stop words or doesn't contain lexemes, ignored 
?column? 
---------- 
f 
(1 row) 

t=# select to_tsvector('english', 'Dogs eats bone') @@ to_tsquery('dog'); 
?column? 
---------- 
t 
(1 row) 

Так что я верю в Parturi последней i является необязательным окончание - правый ..

?

Update: из https://en.wiktionary.org/wiki/parturi: partur [я], partur [Eita] => лексема будет partur

+0

Darn, есть ли что-нибудь подобное, что работает для частей слов? :/Кроме того, что вы подразумеваете под опциональным окончанием? 'parturi' as-is является базовым словом, оно буквально переводится в« парикмахер ». Это похоже на поиск «hairdresse» и не получение имен с «парикмахером» в них –

+0

Я обновил ответ, чтобы определить необязательный конец :) –

+0

вы можете использовать как оператор или регулярные выражения для поиска частей слов –

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