基於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)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

to_tsquery(text)搜索引擎

這個函數做用是用來把文本轉化爲可查詢的語句,例如:spa

SELECT to_tsquery('華爲&深圳');

這樣就是尋找文本既包含「華爲」,也包含「深圳」的語句,&是AND與操做,|是OR或操做3d

若是想知道一個tsvector是否讓tsquery成立,可使用 @@ 操做符,例如:code

SELECT to_tsvector('zhparser', '華爲深圳') @@ to_tsquery('華爲&深圳');

這條語句會返回Trueorm

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('華爲');

查詢結果:

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 。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索