Postgres to_tsquery - 奇怪的结果

时间:2011-12-21 20:25:49

标签: sql postgresql

我对to_tsquery和regconfig参数的使用感到非常困惑。

使用Windows上的PostgreSQL 9.0.2。

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.

似乎在寻找“空气”而不是“aires”..正如我所理解的那样是由于'英语'字典..

但使用“简单”并不总是有效。

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 个答案:

答案 0 :(得分:3)

如果默认的tsearch配置(请参阅get_current_ts_config()英语,那么

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配置用于tsvectortsquery,则示例查询匹配:

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

结论:问题SET default_text_search_config='simple'或在TS查询中明确使用to_tsvector('simple', column_name)表单,而不仅仅是column_name