例如:
物聯網 (IoT) 往往會產生大量數據,其中除了數字數據外,還有字符串數據,例如條形碼、車牌、手機號碼、電子郵件地址、姓名等。假設用戶需要在大量的感知數據中進行模糊檢索甚至規則表達式匹配,那麽有哪些有效的方法呢?
制藥行業,在市場上發現的壹批藥品可能存在問題,需要對藥品條形碼執行規則表達式查詢,找出具有復合條件的藥品流向。但在如此復雜的系統中,如何才能使用高效的方法來實現呢?
公共安全、偵查行動中,可能需要進行線索檢索。比如對用戶提供的殘缺手機號、郵箱、車牌、IP地址、QQ號、微信號等進行交叉檢索,根據這些信息加上時間的疊加,進行模糊匹配和關聯,最終找出犯罪分子。但是,有沒有壹種高效的方法來完成這壹過程呢?
同樣的需求還有很多。幾乎所有的模糊匹配場景都需要正則表達式匹配,這與人臉拼圖有些類似,我們也看到出現了強烈的需求。但在技術方面,什麽會更好呢?
在我看來:正則表達式匹配和模糊匹配通常是搜索引擎的專長,但如果您使用 PostgreSQL 數據庫,您仍然可以以良好的性能完成匹配,另外還有分布式解決方案
(例如 plproxy、pg_shard、fdw shard、pg-xc、pg-xl、
首先是應用場景的分類,以及可用於現有技術的優化工具。
.1.帶有前綴的模糊查詢,例如像'ABC%',也可以寫成 ~ '^ABC'
可以使用 btree 索引進行優化,或者拆分列,使用位和或位或疊加的多列索引進行優化(僅適用於固定長度的尾端字符串,例如 char(8))。
.2.帶有後綴的模糊查詢,如'%ABC',也可以寫成 ~ 'ABC$'
可以通過使用反向函數 btree 索引進行優化,或通過拆分列並使用 bit 和 或 bit 或(僅適用於固定長度的尾字符串,如 char(8))堆疊的多列索引進行優化。
.3. 不帶前綴和後綴的模糊查詢,例如"%AB_C%",也可以寫成 ~ 'AB.C'
您可以使用 pg_trgm 的 gin 索引,或者拆分列並使用用 bit 和 或 bit 或 堆疊的多列索引進行優化(僅適用於固定長度的尾字符串,例如 char(8))。
.4. 正則表達式查詢,如 ~ '[\d]+def1.?[a|b|0|8]{1,3}'
您可以通過 pg_trgm 使用 gin 索引,或使用 bit and 或 bit or(僅適用於固定長度的結尾字符串,例如 char(8))覆蓋的多列索引拆分列並進行優化。
PostgreSQL的pg_trgm插件從9.1版本開始支持在模糊查詢中使用索引,並從9.3版本開始支持在規則表達式查詢中使用索引,這大大提高了PostgreSQL對查詢進行定罪的能力。
代碼請參見/postgrespro/pg_trgm_pro
pg_trgm插件的原理是在字符串前面添加2個空格,在字符串末尾添加1個空格,形成壹個新的字符串,並按照每3個相鄰字符將這個新字符串分割成標記。
在使用規則表達式或模糊查詢進行匹配時,會檢索它們的相近度,然後進行過濾。