Postgres to_tsquery - странные результаты - PullRequest
0 голосов
/ 22 декабря 2011

Меня очень смущает использование to_tsquery и параметра regconfig.

Используется PostgreSQL 9.0.2 в Windows.

SELECT name_with_city 
FROM company 
WHERE name_with_city @@ to_tsquery('simple', 'aires|aires:*')

0 rows retrieved.

.. что является правильным результатом, но:

SELECT name_with_city 
FROM company 
WHERE name_with_city @@ to_tsquery('english', 'aires|aires:*')

"Bel-Air Express Paris"
"Med-Air Miami"
"APS Air Parts Tel Aviv"
"Air Malta Luga"
"Air Nauru Melbourne"
...
542 rows retrieved.

, кажется, ищет "air" вместо "aires" .. как я понял, это из-за словаря 'english' ..

Но использование 'simple' не делает 't тоже всегда работает.

SELECT name_with_city 
FROM company 
WHERE name_with_city @@ to_tsquery('simple', 'harms|harms:*')

0 rows retrieved.

, что неверно, но

SELECT name_with_city 
FROM company 
WHERE name_with_city ILIKE 'harms%'

"Harms & Wende Hamburg"
1 rows retrieved.

.. правильно.

Какой запрос мне нужно использовать вместо этого?Как я понял, я могу использовать to_tsquery для поиска частичных слов в текстовом столбце, например: поиск «tech *» выдаст «Lufthansa Technik» и «Technical Aero», но не «Airtech».

1 Ответ

3 голосов
/ 28 сентября 2012

Если конфигурация tsearch по умолчанию (см. get_current_ts_config()) равна english , тогда

name_with_city @@ to_tsquery('simple', 'harms|harms:*')

эквивалентно:

to_tsvector('english', name_with_city) @@ to_tsquery('simple', 'harms|harms:*');

, что на самом деле нето, что вы хотите избежать английского языка, вы бы предпочли:

to_tsvector('simple', name_with_city) @@ to_tsquery('simple', 'harms|harms:*');

С примером строки 'Harms & Wende Hamburg', если конфигурация simple используется как для tsvector, так и для tsquery, пример запроса соответствует:

select 1 WHERE to_tsvector('simple','Harms & Wende Hamburg') 
    @@ to_tsquery('simple', 'harms|harms:*');
=> 1

Вывод: либо выдайте SET default_text_search_config='simple', либо явно используйте форму to_tsvector('simple', column_name) в запросах TS вместо просто column_name.

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