Oracle Text簡介
Oracle Text為查詢應(yīng)用程序和文檔分類應(yīng)用程序中的文本提供索引,單詞和主題搜索以及查看功能。
要設(shè)計(jì)Oracle Text應(yīng)用程序,首先確定期望運(yùn)行的查詢類型。 知道類型后,就可以為任務(wù)選擇最合適的索引。
Oracle Text用于以下類別的應(yīng)用程序:
- Document Collection Applications
- Catalog Information Applications
- Document Classification Applications
- XML Search Applications
1.文檔集合應(yīng)用程序
文本查詢應(yīng)用程序使用戶可以搜索文檔集合,例如網(wǎng)站,數(shù)字圖書館或文檔倉庫。
1.1關(guān)于
文檔集合應(yīng)用集合
該集合通常是靜態(tài)的,并且在初始索引運(yùn)行之后,內(nèi)容沒有明顯變化。 文檔可以是任何大小和格式,例如HTML,PDF或Microsoft Word。 這些文檔存儲在文檔表中。 通過首先為文檔集合建立索引來啟用搜索。
查詢通常由單詞或短語組成。 應(yīng)用程序用戶使用OR和AND等運(yùn)算符指定單詞和短語的邏輯組合。 用戶可以應(yīng)用其他查詢操作來改善搜索結(jié)果,例如詞干,鄰近搜索和通配符。
對于這種類型的應(yīng)用程序,應(yīng)該檢索與查詢最相關(guān)的文檔。 文檔必須在結(jié)果列表中排在高位。
查詢最好與文檔表上的CONTEXT索引一起使用。 為了查詢該索引,應(yīng)用程序在SELECT語句的WHERE子句中使用SQL CONTAINS運(yùn)算符。
1.2文本查詢應(yīng)用程序流程圖
文檔集合上的典型文本查詢應(yīng)用程序使用戶可以輸入查詢。 該應(yīng)用程序輸入CONTAINS查詢,并返回滿足查詢條件的文檔列表(稱為命中列表)。 結(jié)果通常按相關(guān)性排名。 該應(yīng)用程序使用戶可以查看命中列表中的一個(gè)或多個(gè)文檔。
例如,一個(gè)應(yīng)用程序可能會索引Web上的URL(HTML文件)并在整個(gè)索引URL中提供查詢功能。 查詢應(yīng)用程序返回的命中列表由用戶可以訪問的URL組成。
下圖展示了用戶與簡單文本查詢應(yīng)用程序進(jìn)行交互的流程圖:
2.目錄信息應(yīng)用程序
目錄信息由庫存類型信息組成,例如在線書店或拍賣網(wǎng)站。
2.1關(guān)于目錄信息應(yīng)用程序
存儲的目錄信息由文本信息(例如書名)和相關(guān)結(jié)構(gòu)化信息(例如價(jià)格)組成。 通常會定期更新信息,以使在線目錄與庫存保持最新。
查詢通常是文本組件和結(jié)構(gòu)化組件的組合。 結(jié)果幾乎總是按結(jié)構(gòu)化組成部分排序,例如日期或價(jià)格。 良好的響應(yīng)時(shí)間始終是此類查詢應(yīng)用程序的重要因素。
CTXCAT索引可以最好地服務(wù)Catalog應(yīng)用程序。 在SELECT語句的WHERE子句中使用CATSEARCH運(yùn)算符查詢此索引。
2.2目錄查詢應(yīng)用程序流程圖
目錄應(yīng)用程序使用戶可以搜索目錄中的特定項(xiàng)目。 例如,在線商店應(yīng)用程序使用戶可以搜索和購買庫存中的物品。 通常,用戶查詢由一個(gè)文本組件組成,該組件在文本描述以及一些其他訂購條件(例如價(jià)格或日期)中進(jìn)行搜索。
下圖說明了在線電子商店的目錄查詢應(yīng)用程序的流程圖:
- 1)用戶輸入一個(gè)查詢,該查詢由文本組件(例如CD播放器)和結(jié)構(gòu)化組件(例如按價(jià)格訂購)組成。
- 2)該應(yīng)用程序執(zhí)行CATSEARCH查詢。
- 3)該應(yīng)用程序顯示相應(yīng)的排序結(jié)果。
- 4)用戶瀏覽結(jié)果。
- 5)用戶輸入另一個(gè)查詢或執(zhí)行操作,例如購買商品。
3.文檔分類應(yīng)用程序
在文檔分類應(yīng)用程序中,將輸入流或一組文檔與一組預(yù)定義規(guī)則進(jìn)行比較。 如果文檔符合一個(gè)或多個(gè)規(guī)則,則應(yīng)用程序?qū)?zhí)行一項(xiàng)操作。
例如,假設(shè)有新聞報(bào)道傳入。 定義一個(gè)規(guī)則來表示“財(cái)務(wù)”類別。 該規(guī)則本質(zhì)上是一個(gè)或多個(gè)查詢,用于選擇有關(guān)財(cái)務(wù)主題的文檔。 該規(guī)則可能具有“股票或債券或收益”的形式。
當(dāng)文檔到達(dá)華爾街收入預(yù)測并滿足該類別的規(guī)則時(shí),應(yīng)用程序?qū)⒉扇〈胧?,例如將文檔標(biāo)記為財(cái)務(wù)或向一個(gè)或多個(gè)用戶發(fā)送電子郵件。
要?jiǎng)?chuàng)建文檔分類應(yīng)用程序,請創(chuàng)建一個(gè)規(guī)則表,然后創(chuàng)建一個(gè)CTXRULE索引。 要對輸入的文本流進(jìn)行分類,請?jiān)赟ELECT語句的WHERE子句中使用MATCHES運(yùn)算符。
4.XML搜索應(yīng)用程序
XML搜索應(yīng)用程序?qū)ML文檔執(zhí)行搜索。 常規(guī)文檔搜索通常會搜索一組文檔,以返回滿足文本謂詞的文檔。 XML搜索通常使用XML文檔的結(jié)構(gòu)來限制搜索。 通常,僅返回滿足搜索條件的文檔部分。 例如,用戶可能只需要注釋字段包含電力的采購訂單,而不是查找包含單詞"電力"的所有采購訂單。
4.1具有XML搜索應(yīng)用程序的CONTAINS運(yùn)算符
CONTAINS運(yùn)算符非常適合結(jié)構(gòu)化搜索,可以使用WITHIN,HASPATH和INPATH運(yùn)算符執(zhí)行限制性搜索。 如果使用CONTEXT索引,那么還可以受益于Oracle Text搜索的以下特征:
- 基于令牌的空格標(biāo)準(zhǔn)化搜索
- 命中列表按相關(guān)性排名
- 區(qū)分大小寫的搜索
- 章節(jié)搜索
- 語言功能,例如詞干和模糊搜索
- 針對大型文檔集的性能優(yōu)化查詢
注意:如果手動卸載Oracle Text,則刪除DBMS_XDBT軟件包。 如果手動安裝Oracle Text,則創(chuàng)建DBMS_XDBT軟件包。從Oracle Database 12c開始,當(dāng)安裝新的Oracle數(shù)據(jù)庫軟件或進(jìn)行升級時(shí),將自動安裝Oracle XML數(shù)據(jù)庫(XML DB)。
4.2將Oracle文本功能與Oracle XML DB(XML Search Index)相結(jié)合
當(dāng)請想要對應(yīng)用程序進(jìn)行全文檢索時(shí),結(jié)合使用Oracle Text和Oracle XML DB的功能來創(chuàng)建XML搜索索引。 在這種情況下,通過輸入諸如"查找包含單詞Pentium的所有節(jié)點(diǎn)"之類的查詢來利用XML結(jié)構(gòu)。 Oracle Database 12c通過添加對XQuery全文擴(kuò)展的支持,擴(kuò)展了Oracle對W3C XQuery規(guī)范的支持。 通過此支持,可以對存儲在數(shù)據(jù)庫中的XML內(nèi)容執(zhí)行支持XML的全文搜索。
4.2.1使用xml_enable方法獲取XML Search Index
XML Search Index是啟用XML的Oracle文本索引(CTXSYS.CONTEXT)。 該索引類型在一個(gè)統(tǒng)一索引中支持信息檢索搜索和結(jié)構(gòu)化搜索。XML Search Index還在Oracle文本表中內(nèi)部存儲了二進(jìn)制持久文檔對象模型(PDOM),因此可以在二進(jìn)制PDOM上對XML操作進(jìn)行功能評估。 XMLTYPE數(shù)據(jù)存儲支持此XML搜索索引。 在存在這樣的XML搜索索引的情況下,XMLEXISTS被無縫地重寫為CONTAINS查詢。
創(chuàng)建XML Search Index時(shí),將在Oracle Text內(nèi)部表中實(shí)現(xiàn)XML文檔的Binary PDOM。 來自O(shè)racle Text索引的后期評估被重定向?yàn)榕c存儲在此內(nèi)部表中的PDOM背道而馳。
創(chuàng)建XML Search Index:
exec CTX_DDL.CREATE_SECTION_GROUP('secgroup','PATH_SECTION_GROUP');
exec CTX_DDL.SET_SEC_GRP_ATTR('secgroup','xml_enable','t');
CREATE INDEX po_ctx_idx on T(X) indextype is ctxsys.context parameters ('section group SECGROUP');
4.2.2使用Text-on-XML方法
使用Oracle Text,可以在包含XML數(shù)據(jù)的列上創(chuàng)建CONTEXT索引。 列類型可以是XMLType或任何受支持的類型,只要對XML數(shù)據(jù)使用正確的索引首選項(xiàng)。
使用XML上的文本方法,使用標(biāo)準(zhǔn)的CONTAINS查詢并添加結(jié)構(gòu)化約束,以將搜索范圍限制為特定部分,字段,標(biāo)記或?qū)傩浴?即,指定文本運(yùn)算符內(nèi)部的結(jié)構(gòu),例如WITHIN,HASPATH和INPATH。
例如,設(shè)置的CONTEXT索引以使用XML文檔創(chuàng)建章節(jié)。 考慮以下定義purchase order的XML文檔:
<?xml version="1.0"?>
<PURCHASEORDER pono="1">
<PNAME>Po_1</PNAME>
<CUSTNAME>John</CUSTNAME>
<SHIPADDR>
<STREET>1033 Main Street</STREET>
<CITY>Sunnyvalue</CITY>
<STATE>CA</STATE>
</SHIPADDR>
<ITEMS>
<ITEM>
<ITEM_NAME> Dell Computer </ITEM_NAME>
<DESC> Pentium 2.0 Ghz 500MB RAM </DESC>
</ITEM>
<ITEM>
<ITEM_NAME> Norelco R100 </ITEM_NAME>
<DESC>Electric Razor </DESC>
</ITEM>
</ITEMS>
</PURCHASEORDER>
--要在ITEM描述部分中查詢所有包含Pentium的purchase order,請使用WITHIN運(yùn)算符:
SELECT id from po_tab where CONTAINS( doc, 'Pentium WITHIN DESC') > 0;
--使用INPATH運(yùn)算符可以使用XPATH表達(dá)式指定更復(fù)雜的條件:
SELECT id from po_tab where CONTAINS(doc, 'Pentium INPATH (/PURCHASEORDER/ITEMS/ITEM/DESC') > 0;
4.2.3索引JSON數(shù)據(jù)
JavaScript Object Notation(JSON)是一種獨(dú)立于語言的數(shù)據(jù)格式,用于序列化結(jié)構(gòu)化數(shù)據(jù)并通過網(wǎng)絡(luò)(通常在
服務(wù)器和Web應(yīng)用程序之間)交換該數(shù)據(jù)。 JSON提供了一種基于文本的方式來表示JavaScript對象文字,數(shù)組和標(biāo)量數(shù)據(jù)。
create table t1 (txn_date date, po CLOB, constraint c1 check (po is json));
create search index idx on t1(po) for JSON parameters('DATAGUIDE ON sync (on commit)');