GaussDB(DWS)全文檢索特性初探
全文檢索是在互聯網場景下應用非常廣泛的特性,搜索引擎、站內搜索、電商搜索等場景下都會使用到,GaussDB(DWS)同樣也支持全文檢索功能,是基于GIN索引實現的,下面給大家詳細介紹一下GaussDB(DWS)的全文檢索特性的功能。

全文檢索實現的功能,簡單來說就是根據關鍵字從在全文字段中搜索到相關的信息,在不使用全文檢索特性時,只能通過like ‘%keyword%’方式做模糊匹配,無法利用到索引,只能進行全表掃描,效率非常低,全文檢索特性可以有效地提升檢索性能。
全文檢索的基礎就是GIN索引,Generalized Inverted Index,也就是通用倒排索引,是一個存儲對(key, posting list)集合的索引結構,其中key是一個鍵值,而posting list 是一組出現過key的位置。如(‘hello', 2,3)中,表示hello在2和3這兩個位置出現過。
先來了解一下幾個接口
to_tsvector
to_tsvector(text, text)
這個函數可以把一個文本轉換為一個向量,其中保存單詞和其出現的順序,
test=# SELECT to_tsvector('english', 'huawei cloud data warehouse'); to_tsvector -------------------------------------------- 'cloud':2 'data':3 'huawei':1 'warehous':4 (1 row) test=# SELECT to_tsvector('zhparser', '華為云數據倉庫'); to_tsvector ----------------------------------- '云':2 '倉庫':4 '華為':1 '數據':3 (1 row)
to_tsquery
to_tsquery(text)
這個函數作用是用來把文本轉化為可查詢的語句,例如:
SELECT to_tsquery('華為&深圳');
這樣就是尋找文本既包含“華為”,也包含“深圳”的語句,&是AND與操作,|是OR或操作
如果想知道一個tsvector是否讓tsquery成立,可以使用 @@ 操作符,例如:
SELECT to_tsvector('zhparser', '華為深圳') @@ to_tsquery('華為&深圳');
這條語句會返回True
ts_rank
ts_rank(tsvector, tsquery)
這個函數可以計算tsvector和tsquery的近似程度,通過這個函數計算出rank之后,就可以排序了
SELECT ts_rank( to_tsvector('zhparser', '華為深圳'), to_tsquery('華為&深圳') );
講完了這些接口,讓我們來做一些具體實踐:
1.創建數據庫
CREATE DATABASE test ENCODING 'utf8' template = template0;
【注意】全文檢索必須使用在encoding為utf8或者gbk的數據庫上。
2.創建表
CREATE TABLE t1(id int, news text, location text);
3.導入數據
INSERT INTO t1 VALUES(1, '華為云GaussDB(DWS)數據倉庫以2048大規模節點通過信通院評測認證,華為云數據倉庫成為國內首個單集群突破兩千的商用數據倉庫產品', '北京'); INSERT INTO t1 VALUES(2, 'GaussDB(DWS)歷經十年磨煉,是業界領先的企業級云分布式數據倉庫服務', '深圳'); INSERT INTO t1 VALUES(3, '華為GaussDB(DWS)數據倉庫,助力招行“人人用數,創新前行,招行客戶在華為論壇中表示,華為與招行的聯創實驗室還將進一步探索云數倉支持OBS存儲的實踐', '深圳'); INSERT INTO t1 VALUES(4, '數智金融 使能創新,2020 華為 數智金融論壇在溪村成功舉辦', '東莞'); INSERT INTO t1 VALUES(5, '華為云 AI 訓練營西安站:“ModelArts Pro——行業 AI 落地新利器”主題沙龍盛大開幕', '西安');
4.創建索引
CREATE INDEX t1_news_idx ON t1 USING gin(to_tsvector('zhparser', news));
執行查詢:
SELECT * FROM t1 WHERE to_tsvector('zhparser',news) @@ to_tsquery('華為');
查詢結果:
id | news | location ----+----------------------------------------------------------------------------------------------------------------------------------------------+---------- 5 | 華為云 AI 訓練營西安站:“ModelArts Pro——行業 AI 落地新利器”主題沙龍盛大開幕 | 西安 1 | 華為云GaussDB(DWS)數據倉庫以2048大規模節點通過信通院評測認證,華為云數據倉庫成為國內首個單集群突破兩千的商用數據倉庫產品 | 北京 3 | 華為GaussDB(DWS)數據倉庫,助力招行“人人用數,創新前行,招行客戶在華為論壇中表示,華為與招行的聯創實驗室還將進一步探索云數倉支持OBS存儲的實踐 | 深圳 4 | 數智金融 使能創新,2020 華為 數智金融論壇在溪村成功舉辦 | 東莞 (4 rows)
news中只要包含“華為”詞組,都會檢索出來
5.創建多字段聯合索引:
CREATE INDEX t1_news_location_idx ON t1 USING gin(to_tsvector('zhparser', news||location));
執行結果:
查找同時包含兩個詞組
SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('華為 & 深圳');
news跟location只要有一個字段中包含“華為”和“深圳”都會檢索出來
test=# SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('華為 & 深圳'); id | news | location ----+----------------------------------------------------------------------------------------------------------------------------------------------+---------- 3 | 華為GaussDB(DWS)數據倉庫,助力招行“人人用數,創新前行,招行客戶在華為論壇中表示,華為與招行的聯創實驗室還將進一步探索云數倉支持OBS存儲的實踐 | 深圳 (1 row)
查詢包含其中一個詞組
SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('云|深圳');
news跟location只要有一個包含“云”跟“深圳”這兩個詞的任何一個都會檢索出來。
test=# SELECT * FROM t1 WHERE to_tsvector('zhparser', news||location) @@ to_tsquery('云|深圳'); id | news | location ----+----------------------------------------------------------------------------------------------------------------------------------------------+---------- 5 | 華為云 AI 訓練營西安站:“ModelArts Pro——行業 AI 落地新利器”主題沙龍盛大開幕 | 西安 3 | 華為GaussDB(DWS)數據倉庫,助力招行“人人用數,創新前行,招行客戶在華為論壇中表示,華為與招行的聯創實驗室還將進一步探索云數倉支持OBS存儲的實踐 | 深圳 1 | 華為云GaussDB(DWS)數據倉庫以2048大規模節點通過信通院評測認證,華為云數據倉庫成為國內首個單集群突破兩千的商用數據倉庫產品 | 北京 2 | GaussDB(DWS)歷經十年磨煉,是業界領先的企業級云分布式數據倉庫服務 | 深圳 (4 rows)
6.排序
按照某一列包含的某個詞組權重來排序
SELECT id, news, location ,ts_rank_cd(to_tsvector('zhparser',news), query) AS rank FROM t1, to_tsquery('華為') query WHERE query @@ to_tsvector('zhparser',news) order by rank DESC;
執行結果:
test=# SELECT id, news, location ,ts_rank_cd(to_tsvector('zhparser',news), query) AS rank FROM t1, to_tsquery('華為') query WHERE query @@ to_tsvector('zhparser',news) order by rank DESC; id | news | location | rank ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------+------ 3 | 華為GaussDB(DWS)數據倉庫,助力招行“人人用數,創新前行,招行客戶在華為論壇中表示,華為與招行的聯創實驗室還將進一步探索云數倉支持OBS存儲的實踐 | 深圳 | .3 1 | 華為云GaussDB(DWS)數據倉庫以2048大規模節點通過信通院評測認證,華為云數據倉庫成為國內首個單集群突破兩千的商用數據倉庫產品 | 北京 | .2 4 | 數智金融 使能創新,2020 華為 數智金融論壇在溪村成功舉辦 | 東莞 | .1 5 | 華為云 AI 訓練營西安站:“ModelArts Pro——行業 AI 落地新利器”主題沙龍盛大開幕 | 西安 | .1 (4 rows)
搜索出含有“華為”的詞組,并且根據權重排序
按照某一列包含多個詞組權重排序(同時包含兩個詞組)
SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('華為&深圳') query WHERE query @@ to_tsvector('zhparser',news||location) order by rank DESC;
執行結果:
test=# SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('華為&深圳') query WHERE query @@ to_tsvector('zhparser',news||location) order by rank DESC; id | news | location | rank ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------+----------- 3 | 華為GaussDB(DWS)數據倉庫,助力招行“人人用數,創新前行,招行客戶在華為論壇中表示,華為與招行的聯創實驗室還將進一步探索云數倉支持OBS存儲的實踐 | 深圳 | .00555556 (1 row)
搜索出含有“華為”和“深圳”的詞組,并且根據權重排序
按照某一列包含多個詞組權重排序(包含兩個詞組其中一個)
SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('云|深圳') query WHERE query @@ to_tsvector('zhparser', news||location) order by rank DESC;
查看執行結果:
test=# SELECT id, news, location,ts_rank_cd(to_tsvector('zhparser', news||location), query) AS rank FROM t1, to_tsquery('云|深圳') query WHERE query @@ to_tsvector('zhparser', news||location) order by rank DESC; id | news | location | rank ----+----------------------------------------------------------------------------------------------------------------------------------------------+----------+------ 1 | 華為云GaussDB(DWS)數據倉庫以2048大規模節點通過信通院評測認證,華為云數據倉庫成為國內首個單集群突破兩千的商用數據倉庫產品 | 北京 | .2 2 | GaussDB(DWS)歷經十年磨煉,是業界領先的企業級云分布式數據倉庫服務 | 深圳 | .2 5 | 華為云 AI 訓練營西安站:“ModelArts Pro——行業 AI 落地新利器”主題沙龍盛大開幕 | 西安 | .1 3 | 華為GaussDB(DWS)數據倉庫,助力招行“人人用數,創新前行,招行客戶在華為論壇中表示,華為與招行的聯創實驗室還將進一步探索云數倉支持OBS存儲的實踐 | 深圳 | .1 (4 rows)
檢索出包含“云”或者“深圳”的記錄,并且根據權重排序。
通過以上的案例,相信大家對GaussDB(DWS)的全文檢索使用已經有了一些了解,其實全文檢索還有ngram分詞,和自定義詞典等等其他用法,大家如果有興趣,可以訪問DWS產品文檔或者到社區提問,獲取更全面的解答。
EI企業智能 Gauss AP HUAWEI CONNECT 數據倉庫服務 GaussDB(DWS)
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。