摘要:全文檢索是在互聯網場景下應用很是普遍的特性,搜索引擎、站內搜索、電商搜索等場景下都會使用到,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(text, text)post
這個函數能夠把一個文本轉換爲一個向量,其中保存單詞和其出現的順序,性能
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(text)搜索引擎
這個函數做用是用來把文本轉化爲可查詢的語句,例如:spa
SELECT to_tsquery('華爲&深圳');
這樣就是尋找文本既包含「華爲」,也包含「深圳」的語句,&是AND與操做,|是OR或操做3d
若是想知道一個tsvector是否讓tsquery成立,可使用 @@ 操做符,例如:code
SELECT to_tsvector('zhparser', '華爲深圳') @@ to_tsquery('華爲&深圳');
這條語句會返回Trueorm
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('華爲');
查詢結果:
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產品文檔或者到社區提問,獲取更全面的解答。
本文分享自華爲雲社區《GaussDB(DWS)全文檢索特性初探》,原文做者:DWS_Jack 。