2011-12-21 99 views
0

我对使用to_tsquery和regconfig参数非常困惑。Postgres to_tsquery - 奇怪的结果

使用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. 

似乎搜索“空气”,而不是“布宜诺斯艾利斯” ..我的理解是,由于在“英语”词典..

但使用'简单'并不总是工作。

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 *”将发出“汉莎技术”和“技术航空”,但不是“Airtech”。

+1

尝试看结果ts_debug http://www.postgresql.org/docs/9.1/static/textsearch-debugging.html – 2011-12-21 21:44:11

回答

2

如果默认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:*'); 

与样本串“祸及&文德汉堡”,如果用于tsvectortsquerysimple配置,样品查询相匹配:

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