PostgreSQL自帶有一個簡易的全文檢索引擎,可以實現(xiàn)小規(guī)模數(shù)據(jù)量的全文檢索功能。本文我們將引導(dǎo)介紹一下這個功能,對于小數(shù)據(jù)量的搜索這個功能是足夠使用的,而無需搭建額外的ES等重量級的全文檢索服務(wù)器。
創(chuàng)新互聯(lián)是專業(yè)的荔城網(wǎng)站建設(shè)公司,荔城接單;提供做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行荔城網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
PG的全文檢索操作符是 @@ ,當(dāng)一個 tsvector (文檔)和 tsquery (條件)匹配時返回 true ,并且前后順序無影響:
和普通的SQL查詢一樣,只要在 WHERE 條件中使用這個符號就代表使用全文檢索條件篩選文檔了。如:
@@ 操作符支持隱式轉(zhuǎn)換,對于 text 類型可以無需強(qiáng)類型轉(zhuǎn)換( ::tsvector 或 to_tsvector(config_name, text) ),所以這個操作符實際支持的參數(shù)類型是這樣的:
tsquery 查詢條件并不是簡單的正則,而是一組搜索術(shù)語,使用并且使用布爾操作符 (AND)、 | (OR)和 ! (NOT)來組合它們,還有短語搜索操作符 - (FOLLOWED BY)。更詳細(xì)的語法參見 此文檔 。
此外,PostgreSQL還提供了兩個相對簡化的版本 plainto_tsquery 和 phraseto_tsquery 。
plainto_tsquery ( plainto_tsquery([ config regconfig, ] querytext text) returns tsquery )用戶將未格式化的 text 經(jīng)過分詞之后,插入 符號轉(zhuǎn)為 tsquery :
phraseto_tsquery ( phraseto_tsquery([ config regconfig, ] querytext text) returns tsquery )行為和 plainto_tsquery 行為類似,但是分詞之后不是插入 而是 - (FOLLOWED BY):
使用索引可以加快全文檢索的速度。對于全文檢索來說,可選的索引類型是 GIN (通用倒排索引)和 GIST (通用搜索樹),官方文檔更推薦使用 GIN索引 。創(chuàng)建一個 GIN 索引的范例:
也可以是一個連接列:
還可以單獨創(chuàng)建一個 tsvector 列,為這個列創(chuàng)建索引:
除了普通的 ORDER BY 條件之外,PostgreSQL為全文檢索提供了兩個可選的排序函數(shù) ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4 和 ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4 ,以便實現(xiàn)基于 權(quán)重 的排序。
此外,對于PostgreSQL 9.6以上的版本還可以使用 RUM index 排序。(注意,這個是擴(kuò)展,默認(rèn)不包含)。
PostgreSQL默認(rèn)的分詞字典中并不包含中文分詞字典,因此我們必須手工引入。目前一個比較好的項目是 zhparser ,同時這個插件也是阿里云的RDS默認(rèn)包含的。安裝和啟用沒什么好說的。值得一提的是分詞配置參數(shù)。
在 CREATE EXTENSION 之后,必須配置分詞參數(shù)才能正確進(jìn)行分詞和查找,否則什么都查不到。官方文檔提供的一個配置策略是:
n,v,a,i,e,l 這幾個字母分別表示一種token策略,只啟用了這幾種token mapping,其余則被屏蔽。具體支持的參數(shù)和含義可以用 \dFp+ zhparser 顯示:
WITH simple 表示詞典使用的是內(nèi)置的simple詞典,即僅做小寫轉(zhuǎn)換。根據(jù)需要可以靈活定義詞典和token映射,以實現(xiàn)屏蔽詞和同義詞歸并等功能。
比如我們看下面這個例子:
可以看到 江淮 這個詞組在查詢的時候被忽略了,我們啟用 j (abbreviation,簡稱)再看看結(jié)果:
所以實際使用中要設(shè)置合理的token types,過少將導(dǎo)致搜索結(jié)果不準(zhǔn)確,過多將導(dǎo)致性能下降。此外,還有一些諸如 短詞復(fù)合: zhparser.multi_short = f 這一類的控制分詞結(jié)果的選項,根據(jù)實際使用酌情開啟。
PostgreSQL最大的優(yōu)勢主要是兩個方面:
1)PostgreSQL的開源開放性:因為我們是開源的,變擁有了動態(tài)的社區(qū)、增長非常快的社區(qū),新功能總是不斷出現(xiàn)。不僅可靠性很高,性能也很高。
2)PostgreSQL的可擴(kuò)展性:在1986年的時候,它便已經(jīng)被設(shè)計為可擴(kuò)展的??梢韵驍?shù)據(jù)庫添加語言 可以添加數(shù)據(jù)類型 可以添加索引方法、操作符 、類型轉(zhuǎn)換、聚合;支持GIS、Json、全文搜索、范圍類型、XML。
Postgres的獨特之處在于它同時執(zhí)行關(guān)系和非關(guān)系操作?,F(xiàn)在我們從很多不同的地方獲取數(shù)據(jù),關(guān)系系統(tǒng)必須具有靈活性,必須能夠處理復(fù)雜的數(shù)據(jù),而Postgres是唯一真正能夠做到這一點的數(shù)據(jù)庫。
postgreSQL是一款先進(jìn)的開源數(shù)據(jù)庫,擁有非常齊全的自由軟件的對象-關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(ORDBMS),可面向企業(yè)復(fù)雜SQL的OLTP業(yè)務(wù)場景,支持多項企業(yè)級功能,能解決使用數(shù)據(jù)庫的各種難題。
PostgreSQL的優(yōu)勢有很多。它是一個免費的對象-關(guān)系數(shù)據(jù)庫服務(wù)器(ORDBMS),在靈活的BSD許可證下發(fā)行。
postgreSQL的特征
函數(shù):通過函數(shù),可以在數(shù)據(jù)庫服務(wù)器端執(zhí)行指令程序。
索引:用戶可以自定義索引方法,或使用內(nèi)置的 B 樹,哈希表與 GiST 索引。
觸發(fā)器:觸發(fā)器是由SQL語句查詢所觸發(fā)的事件。如:一個INSERT語句可能觸發(fā)一個檢查數(shù)據(jù)完整性的觸發(fā)器。觸發(fā)器通常由INSERT或UPDATE語句觸發(fā)。 多版本并發(fā)控制:PostgreSQL使用多版本并發(fā)控制(MVCC,Multiversion concurrency control)系統(tǒng)進(jìn)行并發(fā)控制,該系統(tǒng)向每個用戶提供了一個數(shù)據(jù)庫的"快照",用戶在事務(wù)內(nèi)所作的每個修改,對于其他的用戶都不可見,直到該事務(wù)成功提交。
規(guī)則:規(guī)則(RULE)允許一個查詢能被重寫,通常用來實現(xiàn)對視圖(VIEW)的操作,如插入(INSERT)、更新(UPDATE)、刪除(DELETE)。
數(shù)據(jù)類型:包括文本、任意精度的數(shù)值數(shù)組、JSON 數(shù)據(jù)、枚舉類型、XML 數(shù)據(jù)等。全文檢索:通過 Tsearch2 或 OpenFTS,8.3版本中內(nèi)嵌 Tsearch2。
NoSQL:JSON,JSONB,XML,HStore 原生支持,至 NoSQL 數(shù)據(jù)庫的外部數(shù)據(jù)包裝器。
數(shù)據(jù)倉庫:能平滑遷移至同屬postgreSQL生態(tài)的GreenPlum,DeepGreen,HAWK 等,使用 FDW 進(jìn)行 ETL。
1. 啟動數(shù)據(jù)庫服務(wù)器(posgres用戶):
[postgres@localhost bin]$ postgres -D /opt/postgresql/data/ /opt/postgresql/log/pg_server.log 21
[1] 4508
當(dāng)然如果設(shè)置了環(huán)境變量
PGDATA=/opt/postgresql/data
export PGDATA
后,可使用pg_ctl工具進(jìn)行啟動:
[postgres@localhost log]$ pg_ctl start -l /opt/postgresql/log/pg_server.log
pg_ctl: another server might be running; trying to start server anyway
pg_ctl: could not start server
Examine the log output.
[postgres@localhost log]$
因為之前已經(jīng)啟動,所以打印“another server might be running”。此時,查看日志,有如下信息:
[postgres@localhost log]$ cat pg_server.log
FATAL: lock file "postmaster.pid" already exists
HINT: Is another postmaster (PID 4491) running in data directory "/opt/postgresql/data"?
[postgres@localhost log]$
當(dāng)然,最簡的.啟動方式是:
[postgres@localhost ~]$ pg_ctl start
server starting
[postgres@localhost ~]$ LOG: database system was shut down at 2011-07-09 13:58:00 CST
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
如果要在操作系統(tǒng)啟動時就啟動PG,可以在/etc/rc.d/rc.local 文件中加以下語句:
/opt/postgresql/bin/pg_ctl start -l /opt/postgresql/log/pg_server.log -D /opt/postgresql/data
2.關(guān)閉服務(wù)器
最簡單方法:
[postgres@localhost ~]$ pg_ctl stop
waiting for server to shut down.... done
server stopped
與Oracle相同,在關(guān)閉時也可采用不同的模式,簡介如下:
SIGTERM
不再允許新的連接,但是允許所有活躍的會話正常完成他們的工作,只有在所有會話都結(jié)束任務(wù)后才關(guān)閉。這是智能關(guān)閉。
SIGINT
不再允許新的連接,向所有活躍服務(wù)器發(fā)送 SIGTERM(讓它們立刻退出),然后等待所有子進(jìn)程退出并關(guān)閉數(shù)據(jù)庫。這是快速關(guān)閉。
SIGQUIT
令 postgres 向所有子進(jìn)程發(fā)送 SIGQUIT 并且立即退出(所有子進(jìn)程也會立即退出),而不會妥善地關(guān)閉數(shù)據(jù)庫系統(tǒng)。這是立即關(guān)閉。這樣做會導(dǎo)致下次啟動時的恢復(fù)(通過重放 WAL 日志)。我們推薦只在緊急的時候使用這個方法。
SIGKILL
此選項盡量不要使用,這樣會阻止服務(wù)器清理共享內(nèi)存和信號燈資源,那樣的話你只能在啟動服務(wù)器之前自己手工做這件事。另外,SIGKILL 直接把 postgres 殺掉,而不會等它把信號中繼給它的子進(jìn)程,因此我們還需要手工殺掉每個獨立子進(jìn)程。
使用方法舉例:
[postgres@localhost ~]$ pg_ctl stop -o SIGTERM
LOG: received smart shutdown request
LOG: autovacuum launcher shutting down
waiting for server to shut down....LOG: shutting down
LOG: database system is shut down
done
server stopped
[postgres@localhost ~]$
最快速關(guān)閉方法:kill postgres 進(jìn)程
[postgres@localhost ~]$ kill -INT `head -1 /opt/postgresql/data/postmaster.pid`
[postgres@localhost ~]$ LOG: received fast shutdown request
LOG: aborting any active transactions
LOG: autovacuum launcher shutting down
LOG: shutting down
LOG: database system is shut down
附:postgre啟動后的進(jìn)程,如下:
[postgres@localhost ~]$ ps -ef|grep post
root 4609 4543 0 13:57 pts/2 00:00:00 su - postgres
postgres 4610 4609 0 13:57 pts/2 00:00:00 -bash
postgres 4724 1 0 14:08 pts/2 00:00:00 /opt/postgresql/bin/postgres
postgres 4726 4724 0 14:08 ? 00:00:00 postgres: writer process
postgres 4727 4724 0 14:08 ? 00:00:00 postgres: wal writer process
postgres 4728 4724 0 14:08 ? 00:00:00 postgres: autovacuum launcher process
postgres 4729 4724 0 14:08 ? 00:00:00 postgres: stats collector process
postgres 4752 4610 0 14:11 pts/2 00:00:00 ps -ef
postgres 4753 4610 0 14:11 pts/2 00:00:00 grep post
[postgres@localhost ~]$