3

我有搜索在網絡上許多天似乎互聯網從來沒有聽說過我的問題:的Postgres 9.1全文搜索返回任何結果

我有一個郵政地址數據庫表保存有關英國37M記錄,其中有一個地理空間索引和來源的全文索引像這樣創建:

create index on gb_locations using gin(to_tsvector('english', "Postcode" || ' ' || "Postcode_outcode" || ' ' || "Road" || ' ' || "Neighbourhood" || ' ' || "Admin2" || ' ' || "Admin3");) 

我的全文搜索的格式爲:

SELECT * FROM gb_locations 
WHERE 
    to_tsvector('english', "Postcode" || ' ' || "Postcode_outcode" || ' ' || "Road" || ' ' || "Neighbourhood" || ' ' || "Admin2" || ' ' || "Admin3") @@ plainto_tsquery('english', 'greenham road rg14') 

查詢工作對於大多數英國地址來說都很好,特別是在倫敦地區,但是對於更遠的地點來說,查詢不會返回任何結果。

我已經驗證記錄存在於表格中,因爲我可以使用地理空間搜索來找到它,但是對於全文搜索,似乎數據庫並不知道它。

這是交代:

Bitmap Heap Scan on gb_locations (cost=52.04..56.10 rows=1 width=521) 
    Recheck Cond: (to_tsvector('english'::regconfig, ((((((((((("Postcode")::text || ' '::text) || ("Postcode_outcode")::text) || ' '::text) || "Road") || ' '::text) || ("Neighbourhood")::text) || ' '::text) || ("Admin2")::text) || ' '::text) || ("Admin3")::text)) @@ '''greenham'' & ''road'' & ''rg14'''::tsquery) 
    -> Bitmap Index Scan on text_search_index (cost=0.00..52.04 rows=1 width=0) 
     Index Cond: (to_tsvector('english'::regconfig, ((((((((((("Postcode")::text || ' '::text) || ("Postcode_outcode")::text) || ' '::text) || "Road") || ' '::text) || ("Neighbourhood")::text) || ' '::text) || ("Admin2")::text) || ' '::text) || ("Admin3")::text)) @@ '''greenham'' & ''road'' & ''rg14'''::tsquery) 

任何poiners將不勝感激。

+0

行中的字段的值是什麼預期會匹配'plainto_tsquery('english','greenham road rg14')'? –

+0

郵編= RG147SW Postcode_outcode = RG14 路=格林漢姆路 鄰居=紐伯裏Admin2的= NULL 口語陪練=西伯克郡 – PowerAktar

回答

5

如果某些字段可以爲NULL,則需要在全局串聯中應用coalesce(field, '')以獲取要搜索的字符串。

否則,它似乎與在評論中給出的示例值的工作:

select to_tsvector('english','RG147SW RG14 Greenham Road Newbury West Berkshire') 
    @@ plainto_tsquery('english', 'greenham road rg14'); 

?column? 
---------- 
t 
(1 row) 

但是這一次將不匹配(結果是NULL),當Admin2爲NULL,這將是這種情況,或更一般地說,任何其他字段都被傳遞給||運營商。

select to_tsvector('english','RG147SW RG14 Greenham Road ' || NULL || ' Newbury West Berkshire') 
     @@ plainto_tsquery('english', 'greenham road rg14'); 

?column? 
---------- 

(1 row) 
+0

感謝您的幫助Daneil – PowerAktar

2

我想補充一下丹尼爾·維泰說,

全文索引必須創建如下如果任何字段的預期是NULL:

create index [index name] on [table name] using gin(to_tsvector('english', coalesce("Field1",'') || ' ' || coalesce("Field2",'') || ' ' || coalesce("Field3",'') ....)); 

而且相同模板必須在查詢本身中使用,如下所示:

SELECT * FROM [table name] WHERE to_tsvector('english', coalesce("Field1",'') || ' ' || coalesce("Field2",'') || ' ' || coalesce("Field3",'') ....) @@ plainto_tsquery('english', '[your search sentance/phrase]');