Sunday, July 24, 2011

中文全文檢索

Oracle 資料庫內建全文檢的功能。這個功能包括"中文"的全文檢索方式。但是,如果沒有設定正確,其結果會看起來對,但是又覺怪怪的。

案例一:「寶僑家品股份有限公司」可以找到文章;但是搜尋「寶僑」就找不到文章。
案例二:文章內容有「電熨斗」,卻搜尋不到結果。

以上發生的主要原因是:沒有告訴Oracle資料庫,這些資料是中文字,要用中文字的方式處理,以及進行全文檢索。

什麼!!!中文和英文在尋上有什麼差別?在一般資料庫運作上,一般的索引查詢;也就是使用一般的 CREATE INDEX 所建立的索引,主要是幫助資料庫快速地找到所要查詢的資料。索引本身並沒有太大的意義。

在全文檢索上,所建立全文檢索的索引,則負有識別「TOKEN」的作用。英文與中文的最大差異,英文每個「字」是以空白隔開;這在中文上則沒有辦法以「空白」來區分「字」,必須要另外想辦法進行處理。

為解決該問題,在建立全文檢索索引之前,要告知Oracle資料庫,該需要被建立全文檢索的內容要以「中文」的方式處理。

範例:
以下為簡單的試作,來解釋中文全文檢索所發生的現象。
Table:
TEXT_TABLE (DOC_ID NUMBER, CONTENT CLOB)
DOC_ID: 文件識別代碼
CONTENT: 要被全文檢索的內容
表格範內容如下(內容很長, 故只顯示要查詢索引的內容)

DOC_ID                 CONTENT
---------------------- -------------------------------
1392249                ... ... 寶僑家品股份有限公司... ...

1389541                ... 寶僑家品股份有限公司... ... ...
1391776                ....電熨斗、蒸氣熨斗商品...
                       ... 寶僑家品股份有限公司


在不加上任何指示的情況下,建立索引
create index index1 on text_table(content) indextype is ctxsys.context;

執行SQL,與結果如下:

SELECT DOC_ID FROM text_table
where CONTAINS(content,'寶僑家品股份有限公司',1) > 0;


DOC_ID                
----------------------
1392249               
1389541               
1391776               


SELECT DOC_ID FROM text_table
where CONTAINS(content,'寶僑',1) > 0;

DOC_ID                
----------------------



SELECT DOC_ID FROM text_table
where CONTAINS(content,'電熨斗',1) > 0;

DOC_ID                
----------------------

很奇怪,對吧?

可以透過 CTX_REPORT.DESCRIBE_INDEX 來了解 Oracle 資料庫是怎麼看這個全文檢索的建立。
select ctx_report.describe_index('INDEX1') from dual;

CTX_REPORT.DESCRIBE_INDEX('INDEX1')    
------------------------------------
...
...
lexer:                         BASIC_LEXER
...
...
其中 LEXER 顯示為"BASIC_LEXER"。BASIC_LEXER只提供以空白作為字區隔的英文與西歐語言的全文檢索方式。所以產生上列的查詢結果,也就不會太奇怪了。

為了要正確地能以中文的方式進行全文檢索,在建立全文檢索索引前,必需訴 Oracle 資料庫,以下要檢索的內容是中文,請以中文的方式進行檢索。
執行下行 SQL 指令:
execute ctx_ddl.create_preference('CHINESE_LEXER','chinese_lexer');
定義中文的 lexer

再來才是建立全文檢索的索引,並告訴資料庫要使用中文的方式檢索
create index index1
on text_table(content)
indextype is ctxsys.context
parameters('FILTER CTXSYS.AUTO_FILTER LEXER CHINESE_LEXER')
;
請注意到 parameters 內所傳遞的參數

我們再檢驗之前所執行的 SQLs
SELECT DOC_ID FROM text_table
where CONTAINS(content,'寶僑家品股份有限公司',1) > 0;


DOC_ID
----------------------
1392249
1389541
1391776



SELECT DOC_ID FROM text_table
where CONTAINS(content,'寶僑',1) > 0;


DOC_ID
----------------------

1392249
1389541
1391776



SELECT DOC_ID FROM text_table
where CONTAINS(content,'電熨斗',1) > 0;


DOC_ID
----------------------

1391776

這才是我們認為應該出現的結果。

Monday, July 04, 2011

Oracle BIEE 整合台灣地圖 Part II -- OBIEE 與 MAP 連結設定

使用環境:Oracle Business Intelligence 11g (11.1.1.3)
執行於Weblogic Server 以及 Mapviewer已安裝.

1. 設定有那些地圖(Map) 與 圖層(Theme) 要與 OBIEE 整合
選擇"管理"->"地圖資料管理/管理地圖資料". 會看到"圖層", "背景地圖", 與"影像" 三個TAB
點選"圖層", 並將之前所定義的圖層(Theme) 選擇, 匯入。
下圖為選擇要加入的圖層

 點選該圖層,並選擇右上角的「編輯」
 接下來,就是如何將OBIEE 與 圖層的所屬性 進行連結(註:圖層的屬性, 在之前使用MapBuilder定義圖層時,所定義)







按下「確定」後結束圖層的定義。

接下來,設定「背景地圖」
做法如圖層,只不過次可以選的是地圖。另外在編輯的部分則是要義
BI關聯的縮放比例
如下圖
如上圖,地圖一共可以縮放10層。但第0層時,不顯示。第1層,顯示"TAIWAN"圖層;第2~4層顯示"TWN_COUNTY":第5~9層顯示"TWN_TOWN"。

最後,就是把地圖放入OBIEE ANALYTICS
選擇"新建"->"分析"->選取主題區域
(註:因為資料面的關係, 以下為示意)
選擇 "C52County Name", "1-Revenue" (這些欄位已與圖層進行連結)
點選"結果" TAB,再點選"新檢視"->"對應"(中文翻譯出錯;英文為Map,應該翻譯成"地圖" )
結果顯示如下: