У меня есть схема, как это (упрощенный):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.
Если 'finnish' не ваша по умолчанию FTS со nfig, вы должны дать ''финский' '(если вы хотите использовать это) в качестве первого параметра как для' to_tsvector() 'и' to_tsquery() '. - Я точно не знаю, что происходит, когда запрос токенизуется иначе, чем вектор (документ), но я не думаю, что что-то хорошее может придумать эту настройку. – pozs
Кроме того, для чистого совпадения префикса (где 'lemmin' или' lemmink' не является полным стеблем), вы должны использовать 'to_tsquery ('finnish', 'lemmin: *')' – pozs
Также (снова :)), в результате чего имена людей на самом деле не является одной из сильных сторон FTS. – pozs