>>-+-CONTAINS------+--(--handle--,--search-argument--)--------->< +-NO_OF_MATCHES-+ '-RANK----------'
>>-SEARCH_RESULT------------------------------------------------> >----(--schema--,--table--,--handle--,--search-argument--)-----><
本節說明如何使用 DB2 Text Extender 提供的 SQL 函數,在含有文字的 DB2 資料庫中搜尋。 它會告訴您如何:
SEARCH_RESULT 的使用會在改善搜尋效能中予以說明。
這些 DB2 Text Extender 函數在文字索引中搜尋出現的搜尋引數。 如果表格中有 100 000 個文字文件, CONTAINS、RANK 或 NO_OF_MATCHES 函數會被呼叫 100 000 次。 但不會搜尋文字索引 100 000 次。相反地, 第一次呼叫函數時會建立一個內部列示,列出含有搜尋術語的全部文件; 後續的函數呼叫會判斷所要的文件是否在列示中。
要訣 |
---|
使用 DB2 Text Extender 函數在表格中搜尋時,請記得傳遞 handle 直欄給函數, 不要傳遞文字直欄。如果嘗試在文字直欄中搜尋, 則 SQL 會用指出「資料類型錯誤」的訊息來回應,例如: 在函數路徑中找不到含有相容引數且名稱為 CONTAINS 的函數。 |
如果在發出 ENABLE TEXT TABLE 或 ENABLE TEXT COLUMN 指令後立即搜尋文字, 則會發生錯誤 RC_SE_EMPTY_INDEX, 指出指令所建立的索引不存在。 建立索引所需的時間依據各個因素而定(如正在編製索引的文件數), 以及處理此索引的系統效能。 它的時間可從數分鐘到數小時不等,且應在系統負載較輕時完成(如前一晚)。
如果出現此訊息,請稍後再試著搜尋,或使用 GET INDEX STATUS 來檢查編製索引是否已發生錯誤。
此範例舉例說明 CONTAINS 函數如何在用 handle 識別的文件中搜尋文字。如果文字與搜尋引數相符, 則傳回 1,否則,傳回 0。
db2=>SELECT DATE, SUBJECT FROM DB2TX.SAMPLE WHERE DB2TX.CONTAINS (COMMENTHANDLE, '"compress"') = 1
在此例中,您搜尋的是直欄 COMMENTHANDLE 之 handle 所參照之文字中的術語 compress。 COMMENTHANDLE 直欄中的 handle 會指出為 COMMENT 文字編製索引的位置。
要訣 |
---|
如果已建立表格或直欄的大小寫混合識別字, 請記住,必須用雙引號括住這些名稱。例如: db2=>SELECT DATE, SUBJECT FROM "db2tx.sample" WHERE DB2TX.CONTAINS (COMMENTHANDLE, '"compress"') = 1 如果是從指令行中指定 DB2 UDB select 陳述式, 作業系統指令行剖析器會移除指令字串中的特殊字元(如雙引號), 所以您必須使用反斜線來遮罩這些特殊符號。例如: DB2 "SELECT DB2TX.file(COMMENTHANDLE) FROM db2tx.sample" WHERE DB2TX.CONTAINS (COMMENTHANDLE, '\"compress\"') = 1 |
使用 NO_OF_MATCHES 函數,可判定在每份文字文件中找到搜尋準則的頻率。
db2=>WITH TEMPTABLE(DATE, SUBJECT, MATCHES) AS (SELECT DATE, SUBJECT, DB2TX.NO_OF_MATCHES(COMMENTHANDLE,'"compress"') FROM DB2TX.SAMPLE) SELECT * FROM TEMPTABLE WHERE MATCHES > 0
NO_OF_MATCHES 傳回整數值。
RANK 是絕對值,可指出符合搜尋準則之文件與其它找到文件的關聯程度。 此值可指出文件中相對於文件大小的相配數目。 您可使用 RANK 函數來取得找到的文件等級。
此處為範例:
db2=>WITH TEMPTABLE(DATE, SUBJECT, RANK) AS (SELECT DATE, SUBJECT, DB2TX.RANK(COMMENTHANDLE,'"compress"') FROM DB2TX.SAMPLE) SELECT * FROM TEMPTABLE WHERE RANK > 0 ORDER BY RANK DESC
RANK 傳回的 DOUBLE 值是介於 0 及 1 之間。