Postgresql

如何對文本中的單個值實現全文搜尋柱子?

  • November 19, 2018

我在 Ubuntu 12.4 機器上使用 Postgresql 9.3。

我最近才開始研究數據庫和數據庫設計,我將創建一個包含稍後將被搜尋的文本的數據庫。我已經閱讀了 tsvectors 和比 更好的東西WHERE column LIKE 'query',但我沒有太多經驗。我正在考慮建構一個表,其中一列是 type text[],另一列是從文本建構的 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)) ;

我可能很難弄清楚哪些數組成員會導致任何給定的匹配,但無論您使用數組還是列名列表,情況都是如此。

數組確實有相當多的儲存和訪問成本,但是如果您儲存在數組中的數據非常大,那麼相對於數據不可減少的成本而言,數組成本可能並不重要。

引用自:https://dba.stackexchange.com/questions/162932