基於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('華為');

查詢結果:

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 。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM