如何對文本中的單個值實現全文搜尋柱子?
我在 Ubuntu 12.4 機器上使用 Postgresql 9.3。
我最近才開始研究數據庫和數據庫設計,我將創建一個包含稍後將被搜尋的文本的數據庫。我已經閱讀了 tsvectors 和比 更好的東西
WHERE column LIKE 'query'
,但我沒有太多經驗。我正在考慮建構一個表,其中一列是 typetext[]
,另一列是從文本建構的 tsvector 。我將使用文本數組,因為某些文本將以不同的格式等顯示給使用者。我以前從未使用過數組列。我的問題是:
- 在這種情況下,使用文本數組是個好主意嗎?
- 文本數組是否適用於 tsvector?
- 使用會
text[]
影響我的表現嗎?- 有什麼陷阱我應該保持警惕嗎?
感謝您的關注,這是我在這裡的第一篇文章,所以如果我在這個問題上搞砸了,請告訴我。PS:我事先已經在這裡搜尋過這個話題,我希望我沒有創建一個多餘的問題。PPS:不是母語人士,對於奇怪的語言感到抱歉。
**編輯:**感謝您的回答!數組中的文本不會是固定大小的。它們的範圍從 6 到 20 行,但它們需要是可編輯的,並且數組中的一些文本在顯示給使用者時會以不同的方式格式化。我沒有使用多個
text
列,因為表中的某些條目將在數組中包含一個、兩個或多個元素。我知道每個元素將如何被格式化,因為每一行也會有一個“類型”列,它將定義它的格式。
像這樣使用有很多問題
text[]
,但基本上我同意@jjanes
他說的,你怎麼知道數組的哪個成員得到了什麼樣的格式?如果該邏輯被硬編碼到數組中成員的位置,那麼為什麼不只擁有多個列並將格式設置為列名呢?
遵循黃金法則,您可以更直接、更簡單地做到這一點,
- 如果數組中的元素不能被打亂,那麼順序很重要,元素是序數的
ARRAY
如果順序很重要,則無論全文搜尋如何,您都不應該使用****type 。此外,
to_tsvector
呼叫是一個非常糟糕的主意,這種設計也有問題。ARRAY
不適用於無模式設計,並且數組中的位置本身不應是在應用程序中呈現數據所需的資訊。作為旁注,在標準化顯示中,您可以使用 FTS 進行稱重/排名。為了使用您的架構,
text[]
無論如何您都必須從無架構濫用轉向實際架構設計。厭惡
如果你決定走這條路,這應該會更快更乾淨。但是,這是一個可怕的想法。
CREATE AGGREGATE tsvector_agg (tsvector) ( SFUNC = tsvector_concat, STYPE = tsvector ); CREATE OR REPLACE FUNCTION text_array_to_tsvector( mytext text[], out tsv tsvector ) AS $func$ BEGIN SELECT INTO tsv tsvector_agg(to_tsvector(t)) FROM unnest(mytext) AS t; RETURN; END; $func$ LANGUAGE plpgsql IMMUTABLE;
比較兩者,
EXPLAIN ANALYZE SELECT to_tsvector(array_to_string(ARRAY['foo', 'bar', 'baz'],' '::text)); EXPLAIN ANALYZE SELECT text_array_to_tsvector(ARRAY['foo', 'bar', 'baz']);
也可以看看
使用數組可能不是一個好主意,但您沒有提供足夠的資訊來確定。它們能有多大?它們都是固定大小的嗎?
你怎麼知道數組的哪個成員得到了什麼樣的格式?如果該邏輯被硬編碼到數組中成員的位置,那麼為什麼不只擁有多個列並將格式設置為列名呢?
您可以將文本數組與 tsvector 一起使用,例如:
select to_tsvector(array_to_string(ARRAY['a','b','c'],' '::text)) ;
我可能很難弄清楚哪些數組成員會導致任何給定的匹配,但無論您使用數組還是列名列表,情況都是如此。
數組確實有相當多的儲存和訪問成本,但是如果您儲存在數組中的數據非常大,那麼相對於數據不可減少的成本而言,數組成本可能並不重要。