不錯的關於Oracle 全文索引的文章(zt)

jolly10發表於2009-12-29

Oracle7.3開始支援全文檢索,即使用者可以使用Oracle伺服器的上下文(ConText)選項完成基於文字的查詢。具體可以採用萬用字元查詢、模糊匹配、相關分類、近似查詢、條件加權和詞意擴充等方法。在Oracle8.0.x中稱為ConText ;在Oracle8i中稱為interMedia Text Oracle9i中稱為Oracle Text

http://blog.csdn.net/fengzhu1008/archive/2009/01/15/3784853.aspx

[@more@]

Oracle 全文索引

前言

Oracle7.3開始支援全文檢索,即使用者可以使用Oracle伺服器的上下文(ConText)選項完成基於文字的查詢。具體可以採用萬用字元查詢、模糊匹配、相關分類、近似查詢、條件加權和詞意擴充等方法。在Oracle8.0.x中稱為ConText ;在Oracle8i中稱為interMedia Text Oracle9i中稱為Oracle Text

Oracle Text9i標準版和企業版的一部分。Oracle9i將全文檢索功能做為內建功能提供給使用者,使得使用者在建立資料庫例項時自動安裝全文檢索。Oracle Text的應用領域有很多:

l 搜尋文字 :需要快捷有效搜尋文字資料的應用程式。

l 管理多種文件:允許搜尋各種混和文件格式的應用程式,包括ord,excel,lotus等。

l 從多種資料來源中檢索文字:不僅來自Oracle資料庫中的文字資料,而且可以來自Internet和檔案系統的文字資料。

l 搜尋XML應用程式。

 

1、搜尋文字

不使用Oracle text功能,也有很多方法可以在Oracle資料庫中搜尋文字.可以使用標準的INSTR函式和LIKE運算子實現.

SELECT *

FROM mytext

WHERE INSTR (thetext, 'Oracle') > 0;

SELECT *

FROM mytext

WHERE thetext LIKE '%Oracle%';

有很多時候,使用instrlike是很理想的,特別是搜尋僅跨越很小的表的時候。然而透過這些文字定位的方法將導致全表掃描,對資源來說消耗比較昂貴,而且實現的搜尋功能也非常有限。

利用Oracle Text,你可以回答如“在存在單詞’Oracle’的行同時存在單詞’Corporation’而且兩單詞間距不超過10個單詞的文字,查詢含有單詞’Oracle’或者單詞’california’的文字,並且將結果按準確度進行排序,含有詞根train的文字”,以下的sql程式碼實現瞭如上功能,我們且不管這些語法是如何使用的:

DROP INDEX index mytext_idx; --丟棄索引mytext_idx

/

CREATE INDEX mytext_idx

ON mytext( thetext )

INDEXTYPE is CTXSYS.CONTEXT; --建立CONTEXT型別索引mytext_idx

/

SELECT id

FROM mytext

WHERE contains (thetext, 'near((Oracle,Corporation),10)') > 0; --發出contains查詢

SELECT score (1), id

FROM mytext

WHERE contains (thetext, 'Oracle or california', 1) > 0

ORDER BY score (1) DESC

/

SELECT id

FROM mytext

WHERE contains (thetext, '$train') > 0;

2、索引介紹

利用Oracle Text對文件集合進行檢索的時候,你必須先在你的文字列上建立索引。索引將文字打碎分成很多記號(token),這些記號通常是用空格分開的一個個單詞。

Oracle Text應用的實現實際上就是一個 資料裝載—> 索引資料—>執行檢索 的一個過程。

建立的Oracle Text索引被稱為域索引(domain index),包括4種索引型別:

CONTEXTCTXCATCTXRULE CTXXPATH

依據你的應用程式和文字資料型別你可以任意選擇一種。可以利用Create Index建立這4種索引。下面說一下這4種索引的使用環境:

l CONTEXT用於對含有大量連續文字資料進行檢索。支援wordhtmlxmltext等很多資料格式。支援中文字符集,支援分割槽索引,唯一支援並行建立索引(Parallel indexing)的索引型別。對錶進行DML操作後,並不會自動同步索引。需要手工同步索引。查詢運算子:CONTAINS

l CTXCAT當使用混合查詢語句的時候可以帶來很好的效率。適合於查詢較小的具有一定結構的文字段。具有事務性,當更新主表的時候自動同步索引。The CTXCAT index does not support table and index partitioning, documents services (highlighting, markup, themes, and gists) or query services (explain, query feedback, and browse words.)查詢運算子:CATSEARCH

l CTXRULEUse to build a document classification application. You create this index on a table of queries, where each query has a classification. Single documents (plain text, HTML, or XML) can be classified by using the MATCHES operator查詢運算子:MATCHES

l CTXXPATHCreate this index when you need to speed up ExistsNode() queries on an XMLType columnCan only create this index on XMLType column.查詢運算子:無。

在以上4種索引中,最常用的就是CONTEXT索引,使用CONTAINS運算子進行查詢。Oracle Text 索引將文字打碎分成很多的記號(token),例如文字‘I Love www.itpub.net’將會被分成:ILOVEWWWITPUBNET這樣的記號(token)。

Oracle Text CONTEXT 索引是反向索引(inverted index)。每個記號 token)都對映著包含它自己的文字位置。在索引建立過程中,單詞Cat會包括如下的條目入口:

Cat row1,row2,row3

表示Cat在行row1row2row3都出現過,這樣透過查詢單詞所對應的行的rowid就可以迅速找到文字記錄。

在索引建好後,我們可以在該使用者下查到Oracle自動產生了以下幾個表:(假設索引名為myindex):DR$myindex$IDR$myindex$KDR$myindex$RDR$myindex$N其中以I表最重要,預設情況下全文索引是不區分大小寫。

賦許可權:

grant resource,dba,connect,ctxapp to username;

grant execute on ctxsys.ctx_ddl to username;--用於建立同步和最佳化索引的儲存過程。

說明:ctxapp用於使用者建立Oracle Text索引

3CONTEXT索引

語法:

CREATE INDEX [schema.]index on [schema.]table(column) INDEXTYPE IS ctxsys.context [ONLINE]

LOCAL [(PARTITION [partition] [PARAMETERS('paramstring')]

[, PARTITION [partition] [PARAMETERS('paramstring')]])]

[PARAMETERS(paramstring)] [PARALLEL n] [UNUSABLE];

資料庫用建立和插入這些索引的方法叫做索引管道(index Pipeline)。根據不同的引數構建索引,可以應用於很多實際環境。

類別

描述

Datastore

從哪裡得到資料?

Filter

將資料轉換成文字

Lexer

正在索引什麼語言?

Wordlist

應該如何展開莖幹和模糊查詢

Storage

如何儲存索引

Stop List

什麼單詞或者主題不被索引?

Section Group

允許在區段內查詢嗎?如何定義文件區段。這把文件轉換成普通文字

這些引數在建立CONTEXT索引過程中將按下圖順序對索引程式起作用。在本篇中提供一些簡單demo會看到各個引數的作用。

建立索引時,系統預設文件儲存在資料庫的文字列中。如果不顯示的指定索引引數,系統會自動探測文字語言,資料型別和文件格式。

CREATE INDEX myindex ON docs(text) INDEXTYPE IS CTXSYS.CONTEXT;

如上命令在表docstext列上建立了一個預設引數的CONTEXT型別索引myindex,系統預設:

l 文字儲存在資料庫中。可以是CLOB, BLOB, BFILE, VARCHAR2, or CHAR型別的文字資料。

l 文字列語言是資料庫建立時的預設的字符集。

l 使用資料庫預設的終止目錄stoplist.stoplist記錄存在於文字列中但不對其索引的詞。

l 允許模糊查詢。

索引引數

Oracle Text 索引文件時所使用的主要引數如下:

1) 資料儲存邏輯(DATASTORE) 搜尋表的所有行,並讀取列中的資料。通常,這只是列資料,但有些資料儲存使用列資料作為文件資料的指標。例如,URL_DATASTORE 將列資料作為 URL 使用。

2) 過濾器(FILTER) 提取文件資料並將其轉換為文字表示方式。儲存二進位制文件 ( Word Acrobat 檔案) 時需要這樣做。過濾器的輸出不必是純文字格式 -- 它可以是 XML HTML 之類的文字格式。

3) 分段器(SECTIONER) 提取過濾器的輸出資訊,並將其轉換為純文字。包括 XML HTML 在內的不同文字格式有不同的分段器。轉換為純文字涉及檢測重要文件段標記、移去不可見的資訊和文字重新格式化。

4) 詞法分析器(Lexer) 提取分段器中的純文字,並將其拆分為不連續的標記。既存在空白字元分隔語言使用的詞法分析器,也存在分段複雜的亞洲語言使用的專門詞法分析器。

5)    索引引擎(Indexing Engine) 提取詞法分析 器中的所有標記、文件段在分段器中的偏移量以及被稱為非索引字的低資訊含量字列表,並構建反向索引。倒排索引儲存標記和含有這些標記的文件。

DataStore指明你的文字是如何儲存的。系統預設文件儲存在資料庫內的文字列(CHAR, VARCHAR, VARCHAR2, BLOB, CLOB, BFILE, or XMLType)中。DataStore物件在由過濾器處理之前從資料庫中的列摘錄文字。你要索引的文件可以來自多種資料來源。

Datastore Type

Use When

DIRECT_DATASTORE

Data is stored internally in the text column. Each row is indexed as a single document.

MULTI_COLUMN_DATASTORE

Data is stored in a text table in more than one column. Columns are concatenated to create a virtual document, one per row.

DETAIL_DATASTORE

Data is stored internally in the text column. Document consists of one or more rows stored in a text column in a detail table, with header information stored in a master table.

FILE_DATASTORE

Data is stored externally in operating system files. Filenames are stored in the text column, one per row.

NESTED_DATASTORE

Data is stored in a nested table.

URL_DATASTORE

Data is stored externally in files located on an intranet or the Internet. Uniform Resource Locators (URLs) are stored in the text column.

USER_DATASTORE

Documents are synthesized at index time by a user-defined stored procedure.

說明:MULTI_COLUMN_DATASTORE型別的DATASTORE必須在ctxsys使用者下建立,在使用時還需要指明來源,如:

SQL>CONNECT CTXSYS/CTXSYS@SDH155

SQL>EXEC CTX_DDL.CREATE_PREFERENCE(‘mymds’,’MULTI_COLUMN_DATASTORE’);

SQL>EXEC ctx_ddl.set_attibute('mymds', 'columns', 'name, address');

SQL>create index doc_idx on docs(doc) indextype is ctxsys.context

parameters(‘DATASTORE ctxsys.mymds’);

Filter 過濾:一旦彙編了文件,它就沿管道傳遞。接下來這個階段是過濾(Filter.如果文件是一種外來格式,就將它轉換為可讀取的文字,以便進行索引。預設是NULL_FILTER,它簡單的直接傳遞文件,不作任何修改。

通常我們使用NULL_FILTER 過濾普通文字和HTML文件。下面是一個索引HTML文件的例子:

CREATE INDEX myindex

ON docs(htmlfile)

INDEXTYPE IS ctxsys.CONTEXT

PARAMETERS('filter ctxsys.null_filter section group ctxsys.html_section_group');

我們使用null_filter過濾類和ctxsys使用者自帶的 html_section_group區段組類。我們會在後面馬上介紹區段組(Section Groups)的概念。

Section Groups區分組:區分組(Section Groups)是與interMedia一起使用XML的關鍵。這些組處理XML(或者HTML)文件,輸出兩個資料流,即區段界限和文字內容。預設是NULL_SECTION_GROUP,它簡單的直接傳遞文字,不執行任何修改和處理。HTML_SECTION_GROUP是專門用來處理HTML文件的。

Storage 類:Storage(儲存空間)組的類只含有BASIC_STORAGE.預設情況下,BASIC_STORAGE物件的屬性是空的。我們通常需要定製自己的STORAGE類,來控制索引的儲存引數以及儲存空間。建立全文索引的時候我們通常會考慮表段dr$indexname$I,,dr$indexname$R,索引段dr$indexname$X的空間分配。

型別

描述

BASIC_STORAGE

CONTEXT索引指定預設的儲存引數

BASIC_STORAGE 有如下引數

屬性

屬性值

i_table_clause

Parameter clause for dr$indexname$I table creation. Specify storage and tablespace clauses to add to the end of the internal CREATE TABLE statement.

The I table is the index data table.

k_table_clause

Parameter clause for dr$indexname$K table creation. Specify storage and tablespace clauses to add to the end of the internal CREATE TABLE statement.

The K table is the keymap table.

r_table_clause

Parameter clause for dr$indexname$R table creation. Specify storage and tablespace clauses to add to the end of the internal CREATE TABLE statement.

The R table is the rowid table.

The default clause is: 'LOB(DATA) STORE AS (CACHE)'

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271283/viewspace-1030092/,如需轉載,請註明出處,否則將追究法律責任。

不錯的關於Oracle 全文索引的文章(zt)
請登入後發表評論 登入
全部評論

相關文章