[英]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。 最好的解決辦法是:
至少這將是我的方法。 我一直在做大量閱讀,發現人們並沒有將來自多個表的數據組合到 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.