2011-12-21 97 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