Postgresql數據庫全文索引初試【對象關係型數據庫管理系統】

在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
(
 id bigserial NOT NULL,
 text_fti tsvector NOT NULL,)WITH ( OIDS=FALSE);ALTER TABLE full_text_index OWNER TO postgres;
);


         我們注意看字段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中插入數據的時候就會自動將指定字段的信息創建全文索引,並添加到對應的記錄中,此處的查詢語句就比較簡單:

select * from test where content_fti @@ to_tsquery('keyword');
            本文到次就將在postgresql中簡單使用全文索引介紹完了,介紹有不到位支出希望指出,謝謝瀏覽!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章