Postgresql

多列混合搜尋

  • July 21, 2014

我有一個表,其中有一個 JSON 類型的特定列,其中儲存了一些使用者的聯繫資訊。如果需要,我可以更改表並添加具有記憶體值的新列以提高搜尋性能(這是一個新系統,處於設計狀態/開始實施)。

JSON 中的頂級鍵是“名稱”(名字和姓氏都作為一個值)、“地址”(包含街道、州、郵編等的雜湊)和“其他”(電話、電子郵件、www 等)。這是我們儲存的客戶資訊的三類資訊。

這個 JSON 列的一個屬性是,我真的不知道那裡會有什麼鍵(這就是它是 JSON 的原因,所以在這個意義上它仍然很靈活),但我需要搜尋所有值。

我的主要問題是,有人告訴我用一個輸入(如穀歌)實現搜尋功能,它會搜尋每個值,甚至組合(所以如果你搜尋’John Smith Slovakia’,它會找到客戶住在斯洛伐克的約翰史密斯的名字)。

另一個必需的屬性是它必須支持部分搜尋,即如果您不想找到住在名為“Somelongname”的街道上姓 Smith 的每個客戶,那麼輸入“smith somelong”就足夠了仍然會找到他們。

我研究了全文搜尋,它看起來不錯,但它並不真正支持部分搜尋。

有沒有比使用 LIKE ‘%search_token%’ 在所有值中分別搜尋每個輸入單詞然後將每個搜尋標記的結果合併到最終結果中更好、更有效的解決方案?

順便說一句,我正在使用 PostgreSQL。

模式匹配和運算符

全文搜尋不是模式匹配的正確工具(甚至可能是模糊的容錯輸入)。通常,使用運算符的三元相似度搜尋%是這裡的優越方法。您需要為pg_trgm每個數據庫安裝一次附加模組:

可能將其與LIKE(也受三元組索引支持)和文本搜尋結合起來,就像您想到的那樣。結合文本搜尋和相似性的相關答案:

Postgres 中的模式匹配功能概述:

數據庫設計

json對於您的預期功能來說,這是一個非常糟糕的選擇。json必須在半結構化的大字元串 ( )中穿過巨大的柱子,這是非常低效的。

考慮規範化您的模式,這將帶來卓越的性能(如果做得好)。

如果您一心想要json,請考慮jsonb即將發布(即將發布)的 Postgres 9.4 中的新功能。更多(最後一段):

並確保使用功能索引,例如:

進一步優化是可能的。但這需要更詳細的資訊,包括表定義、基數、範例數據和典型查詢。

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