2013-07-05 47 views
0

我對Postgres全文搜索相對較新,但仍然試圖理解它。我正在研究如何在PostgreSQL全文搜索中優化此查詢。查詢看起來是這樣的:改進PostgreSQL FTS查詢

SELECT articles.article_id, article_title, article_excerpt, article_author, article_link_perm, article_default_image, article_date_added, article_bias_avg, article_rating_avg, article_keywords, 
ts_rank(search_vector, to_tsquery('snowden|obama|nsa')) AS rank 
FROM development.articles 
WHERE search_vector @@ to_tsquery('english', 'snowden|obama|nsa') AND ts_rank(search_vector, to_tsquery('snowden|obama|nsa')) > .045 ORDER BY article_date_added DESC, rank DESC LIMIT 20 

而且EXPLAN ANAYLIZE看起來是這樣的:

Limit (cost=20368.26..20368.31 rows=20 width=751) (actual time=276.006..276.101 rows=20 loops=1) 
    -> Sort (cost=20368.26..20376.91 rows=3459 width=751) (actual time=276.001..276.035 rows=20 loops=1) 
     Sort Key: article_date_added, (ts_rank(search_vector, to_tsquery('snowden|obama|nsa'::text))) 
     Sort Method: top-N heapsort Memory: 42kB 
     -> Bitmap Heap Scan on articles (cost=1136.19..20276.22 rows=3459 width=751) (actual time=22.735..273.558 rows=600 loops=1) 
       Recheck Cond: (search_vector @@ '(''snowden'' | ''obama'') | ''nsa'''::tsquery) 
       Filter: (ts_rank(search_vector, to_tsquery('snowden|obama|nsa'::text)) > 0.045::double precision) 
       -> Bitmap Index Scan on article_search_vector_index (cost=0.00..1135.33 rows=10377 width=0) (actual time=20.512..20.512 rows=9392 loops=1) 
        Index Cond: (search_vector @@ '(''snowden'' | ''obama'') | ''nsa'''::tsquery) 
Total runtime: 276.674 ms 

正在使用的是GIN,因爲我更在乎的搜索和更新索引。我注意到這個查詢中的一些問題是'|'我補充說,它越慢。有什麼方法可以優化這個查詢以獲得體面的速度結果?

回答

1

更重要的問題是:

ORDER BY article_date_added DESC, rank DESC 

它使規劃者考慮一束基於全文合適行,然後它結束了他們訴諸。如果你改爲ORDER BY rank DESC,你應該得到更好的結果。 (這種情況下的默認順序是rank DESC。)

對於額外的|性能下降,這是因爲每個附加的字/子查詢都是作爲位圖索引掃描的一部分單獨提取的。行數越多,越會被提取並考慮用於top-n排序。這很正常。

+0

按日期排序是必需的,因爲日期順序很重要。除了|之外還有其他我應該使用的東西嗎?運營商? –

+0

如果你真的認爲它是正確的話,那麼'|'是正確的:搜索乾草堆裏的所有物品,這些物品都擁有針或飛鏢或釘或棒。想想索引作爲主要的pg來探索這個或那部分大海撈針找到相關的文章。搜索範圍越廣,探索的草垛越多,有效行數越多。然後你需要對它們進行分類,而不需要索引。 –