在postgresql中使用全文索引介紹
在近期的開發中由於需要處理比較大的數據量,但是由於沒有資金購買商業數據庫,而且最好不能用盜版的,所以沒辦法就用了這個Postgresql對象關係型數據庫。首先介紹一下這個數據庫,百度百科:“PostgreSQL是以加州大學伯克利分校計算機系開發的 POSTGRES,版本 4.2爲基礎的對象關係型數據庫管理系統(ORDBMS)。PostgreSQL支持大部分 SQL標準並且提供了許多其他現代特性:複雜查詢、外鍵、觸發器、視圖、事務完整性、多版本併發控制。同樣,PostgreSQL 可以用許多方法擴展,比如, 通過增加新的數據類型、函數、操作符、聚集函數、索引方法、過程語言。並且,因爲許可證的靈活,任何人都可以以任何目的免費使用,修改,和分發 PostgreSQL, 不管是私用,商用,還是學術研究使用”。
它是和mysql一樣開源的數據庫,但是其功能卻比mysql強大多了,它可以處理上百萬甚至上千萬條的數據,據我瞭解mysql到來100W條數據時,其效率將會受到嚴重的影響。本篇文章主要講一下給數據庫全文索引的基本使用。全文索引在商業型數據管理系統中是非常常用的,因爲它可以提高數據的檢索效率,在沒有全文索引的時候我們一般都是用like子句來匹配我們搜索的關鍵詞,我們知道like子句執行的效率是非常低的,這嚴重影響了系統的運行效率。因此全文索引就可以提高數據的檢索效率。全文索引是爲我們需要被用戶檢索的信息進行創建全文索引,獨立的存儲在一個表中或者是一個字段上面。一下面將就在表中和字段中創建全文索引來進行介紹。
一、使用獨立的表存儲全文索引的信息
下面我舉例介紹:(注意postgresql在8.3以後在自帶了全文索引,以前的版本需要安裝其他的包,具體我也不是很清楚,有興趣的可以自己看看)
首先我們創建一個數據表:
CREATE TABLE author ( id bigserial NOT NULL, "name" text NOT NULL, author_key text NOT NULL, CONSTRAINT author_key PRIMARY KEY (id), CONSTRAINT "key" UNIQUE (author_key) ) WITH ( OIDS=FALSE );
我們爲該表的的name字段創建一個全文索引,並將它的信息獨立的存儲在一個表中,表如下:
CREATE TABLE full_text_index (
text_fti tsvector NOT NULL,)WITH ( OIDS=FALSE);ALTER TABLE full_text_index OWNER TO postgres;id bigserial NOT NULL,
);
我們注意看字段text_fti,它的類型是tsvector,說明該字段是存儲全文索引的,這就是postgresql數據庫中全文索引的字段類型。
那麼如何將我們的信息自動的創建全文索引信息添加到我們的full_text_index 中呢?那麼這裏將要用到sql中的觸發器,
如下創建觸發器函數:
CREATE OR REPLACE FUNCTION node_text_fti() RETURNS trigger AS $BODY$begin if TG_OP = 'INSERT' then insert into full_text_index (text_fti) values(to_tsvector(coalesce(NEW.name,''))); end if; return NEW;end;$BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION node_text_fti() OWNER TO postgres;
上面的insert語句的values中一個to_tsvector(coalesce(NEW.name,'')),這就是這個數據庫中一個創建全文索引的函數,我們通過調用它,並把相應需創建索引的值給他,就會自動給我們分詞。同時需要在author表中創建一個觸發器:
CREATE TRIGGER create_author_index AFTER INSERT ON author FOR EACH ROW EXECUTE PROCEDURE node_text_fti();
這樣在你向author表中插入數據的時候將會自動在full_text_index中創建全文索引,此處需要注意的是,需要將這兩個表關聯起來,可以設置相同的自動遞增字段id,那麼可以通過這個id來關聯這兩個表,從而使得在full_text_index表中查詢能夠映射到author表中。在查詢的時候需要通過如下的sql語句進行查詢:
select * from author as a join full_text_index as fti on a.id=fti.id where fti.text_fti @@ to_tsquery('keyword');
通過join運算將兩個表關聯起來,這就實現了全文索引,一般情況下都是採用使用一個獨立的表來存儲全文索引信息。
二、使用字段存儲全文索引信息
首先也創建一個數據表:
CREATE TABLE test_fti ( "ID" integer NOT NULL DEFAULT nextval('"testFTI_ID_seq"'::regclass), "content" text NOT NULL, content_fti tsvector, CONSTRAINT "testID" PRIMARY KEY ("ID") ) WITH ( OIDS=FALSE ); ALTER TABLE test_fti OWNER TO postgres;
此處的字段content_fti則是存儲全文索引的信息,此處也類似需要創建觸發器函數:
CREATE OR REPLACE FUNCTION messages_trigger() RETURNS trigger AS $BODY$ begin new.content_fti := setweight(to_tsvector( coalesce(new.content,''))); return new; end $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION messages_trigger() OWNER TO postgres;
在表test處創建一個觸發器:
CREATE TRIGGER ftitesttrigger BEFORE INSERT OR UPDATE ON test_fti FOR EACH ROW EXECUTE PROCEDURE messages_trigger();
這是在你想test中插入數據的時候就會自動將指定字段的信息創建全文索引,並添加到對應的記錄中,此處的查詢語句就比較簡單:
本文到次就將在postgresql中簡單使用全文索引介紹完了,介紹有不到位支出希望指出,謝謝瀏覽!select * from test where content_fti @@ to_tsquery('keyword');