簡體   English   中英

將來自不同表的兩個 postgresql tsvector 字段連接到單個 postgresql 視圖中,以啟用連接的全文搜索

[英]Concat two postgresql tsvector fields originating in separate tables into single postgresql view to enable joined full text search

我有一個由 3 個表組成的 postgresql 視圖:

create view search_view as 
select u.first_name, u.last_name, a.notes, a.summary, a.search_index 
from user as u, assessor as a, connector as c 
where a.connector_id = c.id and c.user_id = u.id;

但是,我需要將 3 個表中的 2 個 tsvector 字段連接到視圖中的單個 tsvector 字段中,該字段提供跨 4 個字段的全文搜索:2 個來自一個表,2 個來自另一個。

我已經閱讀了說明我可以使用 concat 運算符組合兩個 tsvector 字段的文檔,但我不確定這在語法上是什么樣子,也不確定這個實現是否有潛在的問題。

我正在尋找將兩個 tsvector 字段從不同的表連接到視圖中的示例代碼,以及關於這在 postgresql 領域中是好還是壞的做法的評論。

我想知道同樣的事情。 我認為我們不應該像這樣組合來自多個表的 tsvectors。 最好的解決辦法是:

  1. 在每個表(用戶、評估員、連接器)中創建一個新的 tsv 列
  2. 使用您要搜索的所有文本更新每個表中的新 tsv 列。 例如,在用戶表中,您將更新連接 first_name 和 last_name 列的所有記錄的 tsv 列。
  3. 在新的 tsv 列上創建索引,這比在單個列上建立索引要快
  4. 像往常一樣運行你的查詢,讓 Postgres 去“思考”要使用哪些索引。 它可能會或可能不會在涉及多個表的查詢中使用所有索引。
  5. 使用 ANALYZE 和 EXPLAIN 命令查看 Postgres 如何利用您的新索引進行特定查詢,這將使您深入了解進一步加快速度。

至少這將是我的方法。 我一直在做大量閱讀,發現人們並沒有將來自多個表的數據組合到 tsvectors 中。 實際上我認為這是不可能的,可能只有在創建 tsvector 時才能使用當前表的列。

連接 tsv 向量有效,但根據評論,索引可能不會以這種方式使用(不是專家,不能說它是否確實如此)。

SELECT * FROM newsletters
LEFT JOIN campaigns ON newsletters.campaign_id=campaigns.id
WHERE newsletters.tsv || campaigns.tsv @@ to_tsquery(unaccent(?))

你想要這個的原因是搜索像txt1 & txt2 & txt 3這樣的 AND 字符串,這是非常常見的使用場景。 如果您通過OR WHERE campaigns.tsv @@ to_tsquery(unaccent(?)拆分搜索,這將不起作用,因為它將嘗試匹配兩個 tsv 列中的所有 3 個標記,但標記可能位於任一列中。

我發現的一種解決方案是使用觸發器在 table2 更改時插入和更新 table1 中的 tsv 列,請參閱: https : //dba.stackexchange.com/questions/154011/postgresql-full-text-search-tsv-column -trigger-with-many-to-many但這不是一個明確的答案,使用這么多觸發器很容易出錯並且很麻煩。

官方文檔和一些教程還展示了在不使用 tsv 列的情況下將所有想要的列即時連接到 ts 向量中。 但目前尚不清楚動態與 tsv 列方法相比慢了多少,我找不到關於此的單一基准或解釋。 該文件簡單地說:

另一個優點是搜索會更快,因為不需要重做 to_tsvector 調用來驗證索引匹配。 (這在使用 GiST 索引時比使用 GIN 索引更重要;請參閱第 12.9 節。)然而,表達式索引方法設置起來更簡單,並且由於 tsvector 表示沒有顯式存儲,因此它需要更少的磁盤空間。

我只能從中看出 tsv 列可能會浪費資源並且只會使事情復雜化,但很高興看到一些硬數字。 但是,如果您可以像這樣連接 tsv 列,那么我想這與在 WHERE 子句中執行此操作沒有什么不同。

暫無
暫無

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

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