簡體   English   中英

使用加權 tsvector 用於 PostgreSQL 全文搜索的最佳索引

[英]Best index to use for PostgreSQL full text search with weighted tsvector

我是數據庫的新手,對索引的工作方式沒有把握。

我正在考慮對我的包含加權的 tsvector 的列進行索引(標題被賦予最大權重,然后是副標題,然后是段落內容)。 根據 Postgres 文檔,GIN 是用於全文搜索的最佳選擇,其次是 GiST。 但是第 12.9 章中有一個注釋:

GIN 索引是首選的文本搜索索引類型。 作為倒排索引,它們包含每個單詞(詞素)的索引條目,以及匹配位置的壓縮列表。 多詞搜索可以找到第一個匹配項,然后使用索引刪除缺少其他詞的行。 GIN 索引僅存儲 tsvector 值的單詞(詞素),而不存儲它們的權重標簽。 因此,在使用涉及權重的查詢時需要重新檢查表行。

這是否意味着 GIN 在我的用例中效率低下,我應該使用 GiST,還是它仍然是最好的使用? 我正在使用最新的 Postgres 版本 (12)。

不,你應該堅持使用 GIN 索引。

索引掃描充當過濾器,並有望消除大部分行,因此只有少數行需要重新檢查。

無論如何,您可能必須獲取表行,因此除非在索引掃描期間發現許多誤報,否則不會有很多額外的工作。

最好的辦法是在你的數據集上運行一些基准測試,這會給你一個權威的答案,哪個索引更適合你的情況。

要找出在位圖堆掃描期間消除了多少誤報,您可以檢查查詢的EXPLAIN (ANALYZE, BUFFERS)的輸出。

tsvector 的 GiST 索引的實現是有損的,因此他們也需要查閱表格。 文檔的那部分很奇怪,因為它似乎將 GIN 與 GiST 進行了對比,但 GIN 和 GiST 都不存儲權重,因此沒有什么可對比的。 (GiST 甚至不存儲比權重少得多的值,只存儲值的散列位)。

此外,權重僅在排名時使用,而不是在搜索時使用。

關於 tsvector 首選 GiST 的唯一時間是,如果您想要一個多列索引,您將對不同列的選擇條件進行 AND 運算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM