0

私はPostgresの全文検索に比較的慣れておらず、まだ理解しようとしています。PostgreSQL 全文検索でこのクエリを最適化する方法に取り組んでいます。クエリは次のようになります。

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 です。これは、検索と更新に関心があるためです。このクエリで気付いた問題のいくつかは、'|' が多いことです。さらに、遅くなるほど遅くなります。このクエリを最適化して、適切な結果を迅速に得るにはどうすればよいでしょうか?

4

1 に答える 1

1

より大きな問題は次のとおりです。

ORDER BY article_date_added DESC, rank DESC

プランナーは、全文に基づいて適用可能な行の束を考慮し、最終的にそれらを並べ替えます。ORDER BY rank DESC代わりに、より良い結果が得られるはずです。(この場合のデフォルトの順序は byrank DESCです。)

さらに|パフォーマンスが低下するのは、ビットマップ インデックス スキャンの一部として、追加の各単語/サブクエリが個別にフェッチされるためです。適格な行が多いほど、より多くの行がフェッチされ、上位 n ソートの対象と見なされます。それは完全に正常です。

于 2013-07-05T20:20:35.820 に答える