小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

使用 Oracle Text 構(gòu)建全文搜索應(yīng)用程序

 dazheng 2007-05-06

使用 Oracle Text 構(gòu)建全文搜索應(yīng)用程序


作者:Marko Asplund

了解如何利用 Oracle 數(shù)據(jù)庫(kù)在應(yīng)用程序中實(shí)現(xiàn)全文搜索。

2007 年 4 月發(fā)布

Oracle Text 是一種功能強(qiáng)大的搜索技術(shù),它內(nèi)置于 Oracle 數(shù)據(jù)庫(kù)的所有版本(包括免費(fèi)提供的快捷版 (XE))中。它所提供的開發(fā) API 使軟件開發(fā)人員能夠輕松實(shí)現(xiàn)功能齊備的內(nèi)容搜索應(yīng)用程序。

Oracle Text 可用于搜索結(jié)構(gòu)化和非結(jié)構(gòu)化文檔,是對(duì) SQL 通配符匹配的補(bǔ)充。Oracle Text 支持使用基本的布爾運(yùn)算符(AND、OR、NOT、NEAR 等)將多個(gè)搜索條目組合到一起,此外,它還具有更高級(jí)的功能,如 soundex 和模糊搜索,以及結(jié)果排序等。該技術(shù)支持?jǐn)?shù)百種文件類型,包括 Microsoft Office 和 PDF。Oracle Text 適合多種與搜索相關(guān)的使用情況和存儲(chǔ)結(jié)構(gòu)。Text 的應(yīng)用領(lǐng)域包括電子商務(wù)、文檔和記錄管理,以及問題跟蹤等。可檢索的文本可以結(jié)構(gòu)化形式駐留在數(shù)據(jù)庫(kù)中,也可以非結(jié)構(gòu)化形式駐留在本地文件系統(tǒng)中或 Web 上。

Oracle Text 提供完整的基于 SQL 的搜索 API,該 API 包含自定義查詢運(yùn)算符、DDL 語(yǔ)法擴(kuò)展、一組 PL/SQL 過程和數(shù)據(jù)庫(kù)視圖。通過 Text API,應(yīng)用程序開發(fā)人員可完全控制索引、查詢、安全、演示以及有時(shí)會(huì)需要的軟件配置,在開發(fā)即需即用的非自定義軟件時(shí)尤為如此。通過即需即用的軟件產(chǎn)品,您希望使軟件的配置盡可能簡(jiǎn)約,即使這意味著要在產(chǎn)品開發(fā)中多做一些前期工作也是如此。降低應(yīng)用程序的復(fù)雜性通常會(huì)在產(chǎn)品生命周期的后期,尤其是在支持、維護(hù)和未來(lái)產(chǎn)品開發(fā)階段中見到成效。

Oracle Text 還支持文檔級(jí)授權(quán),而文檔級(jí)授權(quán)通常很難在統(tǒng)一的同時(shí)保持高性能。借助 Text,組合了關(guān)系數(shù)據(jù)與非結(jié)構(gòu)化數(shù)據(jù)的混和查詢也得到了很好的支持。對(duì)于授權(quán),這意味著您可以將全文搜索和授權(quán)合并到一個(gè)查詢中。獨(dú)立結(jié)果集和獲得最終結(jié)果所需的過濾階段的數(shù)量可最大程度地縮減,從而簡(jiǎn)化了應(yīng)用程序的開發(fā)。Oracle Text 使應(yīng)用程序開發(fā)人員從繁瑣的開發(fā)中解脫出來(lái),可以集中精力進(jìn)行性能優(yōu)化。

Oracle Text 也是編程語(yǔ)言不可知的,并且也可以同樣卓越的表現(xiàn)為 PHP 以及 Java 應(yīng)用程序工作。

前一段時(shí)間,我需要提高企業(yè)內(nèi)容管理 (ECM) 系統(tǒng)的搜索功能。我首先對(duì) Oracle Text 的使用進(jìn)行了評(píng)估。評(píng)估證明 Oracle Text 是一種構(gòu)建應(yīng)用程序搜索非常可行的技術(shù):它具有高級(jí)搜索功能,支持大量不同的文件類型,可高度自定義,同時(shí)高度可伸縮。原有搜索技術(shù)的一個(gè)缺點(diǎn)是,您需要在數(shù)據(jù)庫(kù)外部運(yùn)行文件內(nèi)容搜索,然后運(yùn)行數(shù)據(jù)庫(kù)元數(shù)據(jù)搜索,對(duì)結(jié)果進(jìn)行授權(quán),最后,合并獨(dú)立的結(jié)果集。使用 Oracle Text,所有這些操作都可以在數(shù)據(jù)庫(kù)中進(jìn)行。ECM 系統(tǒng)已經(jīng)使用 Oracle 數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)元數(shù)據(jù)。因?yàn)榇隧?xiàng)技術(shù)已經(jīng)推出,因此客戶自然會(huì)選擇使用,而且它也不會(huì)給客戶增加任何成本。

在數(shù)據(jù)庫(kù)中執(zhí)行自由文本搜索查詢的簡(jiǎn)單方法類似于:

SELECT * FROM issues
WHERE LOWER(author) LIKE ‘%word1%‘ AND LOWER(author) LIKE ‘%word2%‘ ...

使用這種方法,每一列都需要與每個(gè)關(guān)鍵字單獨(dú)進(jìn)行匹配。在每一列中,可以任何順序與關(guān)鍵字進(jìn)行匹配。然而,關(guān)系數(shù)據(jù)庫(kù)的設(shè)計(jì)使得它不會(huì)像上面那樣有效地執(zhí)行查詢,而且使用這種方法會(huì)產(chǎn)生極其不可伸縮的應(yīng)用程序。當(dāng)然,您可以設(shè)計(jì)自己的索引和搜索解決方案,但是,那樣您可能不會(huì)優(yōu)化使用您的資源,在您已經(jīng)為將搜索技術(shù)作為數(shù)據(jù)庫(kù)的一部分付出了成本的情況下尤為如此。

本文討論 Oracle Text 在虛擬的問題跟蹤應(yīng)用程序中的使用。在這個(gè)應(yīng)用程序中,用戶可以創(chuàng)建一些包含元數(shù)據(jù)和可選附加文件的問題。該應(yīng)用程序利用 Oracle Text 實(shí)現(xiàn)元數(shù)據(jù)和可選附加文件內(nèi)容的全文搜索功能。

此處給出的示例已經(jīng)在 Linux 的 Oracle 數(shù)據(jù)庫(kù) XE 上進(jìn)行了測(cè)試,這些示例應(yīng)該同樣也可在其他 Oracle 平臺(tái)上運(yùn)行良好。

索引進(jìn)程與搜索

Oracle Text 為可檢索的數(shù)據(jù)項(xiàng)建立索引之后,用戶才能夠通過搜索查找內(nèi)容。編制索引是確保搜索性能的常用方法。Oracle Text 的索引進(jìn)程是根據(jù)管道建模的,在這個(gè)管道中,從數(shù)據(jù)存儲(chǔ)檢索來(lái)的數(shù)據(jù)項(xiàng)經(jīng)過一系列轉(zhuǎn)換之后,其關(guān)鍵字會(huì)添加到索引中。該索引進(jìn)程分為多個(gè)階段,每個(gè)階段都由一個(gè)單獨(dú)的實(shí)體來(lái)處理,并可由應(yīng)用程序開發(fā)人員來(lái)配置。

Oracle Text 具有適合不同用途的不同索引類型。對(duì)于大型文檔的全文搜索,適合使用 CONTEXT 索引類型。該索引進(jìn)程包括以下幾個(gè)階段:

  1. 數(shù)據(jù)檢索:只是將數(shù)據(jù)從數(shù)據(jù)存儲(chǔ)(例如 Web 頁(yè)面、數(shù)據(jù)庫(kù)大型對(duì)象或本地文件系統(tǒng))中取出,然后作為數(shù)據(jù)流傳送到下一個(gè)階段。
  2. 過濾:過濾器負(fù)責(zé)將各種文件格式的數(shù)據(jù)轉(zhuǎn)換為純文本格式。索引管道中的其他組件只能處理純文本數(shù)據(jù),不能識(shí)別 Microsoft Word 或 Excel 等文件格式。
  3. 分段:分段器添加關(guān)于原始數(shù)據(jù)項(xiàng)結(jié)構(gòu)的元數(shù)據(jù)。
  4. 詞法分析:根據(jù)數(shù)據(jù)項(xiàng)的語(yǔ)言將字符流分為幾個(gè)字詞。
  5. 索引:最后一個(gè)階段將關(guān)鍵字添加到實(shí)際索引中。

索引構(gòu)建完成后,應(yīng)用程序即可通過普通的 SQL 查詢執(zhí)行最終用戶輸入的搜索。

安裝 Oracle Text

在默認(rèn)情況下,Oracle Text 隨 Oracle 數(shù)據(jù)庫(kù) XE 一起安裝。如何使用的是其他數(shù)據(jù)庫(kù)版本,您需要自己安裝 Oracle Text 功能。安裝了此功能后,您只需創(chuàng)建一個(gè)普通的數(shù)據(jù)庫(kù)用戶,并賦予該用戶 CTXAPP 角色。這樣,用戶即可執(zhí)行特定的索引管理過程:

CREATE USER ot1 IDENTIFIED BY ot1;
GRANT connect,resource, ctxapp TO ot1;

文件索引

此處,您要?jiǎng)?chuàng)建一個(gè)文本表,用于為存儲(chǔ)在問題跟蹤系統(tǒng)中的附加文件內(nèi)容建立索引。附加文件存儲(chǔ)在文件系統(tǒng)中。除了應(yīng)用程序的數(shù)據(jù)模型所需的列之外,文本基表還包括一個(gè)絕對(duì)文件路徑和一個(gè)格式列。

CREATE TABLE files (
id NUMBER PRIMARY KEY,
issue_id NUMBER,
path VARCHAR(255) UNIQUE,
ot_format VARCHAR(6)
);
INSERT INTO files VALUES (1, 1, ‘/tmp/oracletext/found1.txt‘, NULL);
INSERT INTO files VALUES (2, 2, ‘/tmp/oracletext/found2.doc‘, NULL);
INSERT INTO files VALUES (3, 2, ‘/tmp/oracletext/notfound.txt‘, ‘IGNORE‘);

此處 ot_format 的值是 Oracle Text 在索引過程中解析出來(lái)的。NULL 值表明系統(tǒng)會(huì)為文件自動(dòng)選擇一個(gè)過濾器,而如果值為 IGNORE,系統(tǒng)會(huì)跳過整個(gè)文件。

可以使用以下語(yǔ)句創(chuàng)建文本索引:

CREATE INDEX file_index ON files(path) INDEXTYPE IS ctxsys.context
PARAMETERS (‘datastore ctxsys.file_datastore format column ot_format‘);

該語(yǔ)句將啟動(dòng)索引進(jìn)程,索引進(jìn)程將通過存儲(chǔ)在基表中的路徑在文件系統(tǒng)中檢索文件,然后對(duì)內(nèi)容進(jìn)行過濾并建立索引。這樣便創(chuàng)建了一個(gè)區(qū)分大小寫并具有精確匹配語(yǔ)義的 CONTEXT 索引。該索引進(jìn)程可以多種方式進(jìn)行自定義,例如支持前綴和后綴匹配。

雖然大部分時(shí)間過濾階段無(wú)需為每個(gè)文件指定文件格式即可很好地運(yùn)行,但是,在基表中添加這一列可以對(duì)索引進(jìn)程進(jìn)行進(jìn)一步控制。例如,使用格式列,您可以跳過某些文件類型不為其建立索引。當(dāng)您只想正式支持應(yīng)用程序中 Oracle Text 所支持的部分文件格式時(shí),這一列非常有用。

Oracle Text 還可用于元數(shù)據(jù)的全文搜索。在示例應(yīng)用程序中,有一個(gè)名為 issues 用于存儲(chǔ)問題元數(shù)據(jù)的表。該表的定義如下:

CREATE TABLE issues (
id       	NUMBER,
summary    	VARCHAR(120),
description	CLOB,
author		VARCHAR(80),
ot_version	VARCHAR(10)
);

ot_version 列為索引列,可用于強(qiáng)制為特定文檔重新建立索引。該表可使用測(cè)試數(shù)據(jù)填充:

INSERT INTO issues VALUES (1, ‘Jane‘, ‘Text does not make tea‘,
‘Oracle Text is unable to make morning tea‘, 1);
INSERT INTO issues VALUES (2, ‘John‘, ‘It comes in the wrong color‘,
‘I want to have Text in pink‘, 1);

用戶索引

Oracle Text 可為來(lái)自不同數(shù)據(jù)源的數(shù)據(jù)建立索引。Oracle Text 可用于問題跟蹤系統(tǒng),提供對(duì)問題元數(shù)據(jù)的全文搜索。在默認(rèn)情況下,您可為單個(gè)列中的值建立索引,但是,如果要合并多個(gè)表的數(shù)據(jù),您需要?jiǎng)?chuàng)建一個(gè)自定義的 PL/SQL 過濾器過程。我將演示如何創(chuàng)建這樣的過程,這個(gè)過程將起到存儲(chǔ)抽象的作用。然后,該索引進(jìn)程將迭代文本表中所有的行,為每一行調(diào)用過濾器過程。過濾器過程將返回所有與問題相關(guān)的有待建立索引的文本。

-- declare indexing procedure
CREATE PACKAGE ot_search AS
PROCEDURE issue_filter(rid IN ROWID, tlob IN OUT NOCOPY CLOB);
END ot_search;
/
-- define indexing procedure
CREATE PACKAGE BODY ot_search AS
PROCEDURE issue_filter(rid IN ROWID, tlob IN OUT NOCOPY CLOB) IS
BEGIN
FOR c1 IN (SELECT author, summary, description FROM issues WHERE rowid = rid)
LOOP
dbms_lob.writeappend(tlob, LENGTH(c1.summary)+1, c1.summary || ‘ ‘);
dbms_lob.writeappend(tlob, LENGTH(c1.author)+1, c1.author || ‘ ‘);
dbms_lob.writeappend(tlob, LENGTH(c1.description), c1.description);
END LOOP;
END issue_filter;
END ot_search;
/
-- define datastore preference for issues
BEGIN
ctx_ddl.create_preference(‘issue_store‘, ‘user_datastore‘);
ctx_ddl.set_attribute(‘issue_store‘, ‘procedure‘, ‘ot_search.issue_filter‘);
ctx_ddl.set_attribute(‘issue_store‘, ‘output_type‘, ‘CLOB‘);
END;
/
-- index issues
CREATE INDEX issue_index ON issues(ot_version) INDEXTYPE IS ctxsys.context
PARAMETERS (‘datastore issue_store‘);

搜索

CONTAINS 運(yùn)算符用于搜索 CONTEXT 索引。雖然 CONTAINS 運(yùn)算符語(yǔ)法的確支持 soundex 匹配等更高級(jí)的功能,但在這些示例中,我們只用了簡(jiǎn)單的布爾運(yùn)算符來(lái)合并關(guān)鍵字。對(duì)于 Oracle Text 支持的語(yǔ)言,模糊匹配和詞根還原都是默認(rèn)啟用的。要利用這些高級(jí)搜索功能,只需將 fuzzy() 或 $ 查詢運(yùn)算符分別與 CONTAINS 運(yùn)算符結(jié)合使用即可。通配符字符可用于前綴和后綴匹配的 CONTAINS 查詢。下面是一些簡(jiǎn)單的查詢示例:

SELECT id FROM issues WHERE CONTAINS(ot_version, ‘color AND pink‘, 1) > 0;
SELECT id FROM issues WHERE CONTAINS(ot_version, ‘jane OR john‘, 1) > 0;

索引維護(hù)

由于基表數(shù)據(jù)是由索引復(fù)制的,因此這些數(shù)據(jù)需要定期與索引進(jìn)行同步。在 CTX_DDL PL/SQL 程序包中可以發(fā)現(xiàn)索引維護(hù)過程。下面給出了一個(gè)示例,顯示如何更新索引以反映基表更改:

EXECUTE ctx_ddl.sync_index(‘issue_index‘, ‘2M‘);

該同步過程為操作提供了索引名稱和使用的內(nèi)存量。也可以讓數(shù)據(jù)庫(kù)定期自動(dòng)執(zhí)行此項(xiàng)任務(wù)。您也可以選擇使用操作系統(tǒng)或其他計(jì)劃工具來(lái)啟動(dòng)同步。例如,在 Unix 系統(tǒng)上,可安排以下 shell 腳本與 Cron 作業(yè),使系統(tǒng)按計(jì)劃執(zhí)行同步:

#!/bin/sh
export ORACLE_SID=orcl
export ORAENV_ASK=NO
source /usr/local/bin/oraenv
sqlplus ot1/ot1@XE > synch.log <<EOF
WHENEVER SQLERROR EXIT 5;
EXECUTE ctx_ddl.sync_index(‘issue_index‘, ‘2M‘);
EOF

CTX_DDL 程序包還包含其他有用的過程,例如索引優(yōu)化,用于消除索引碎片和清除過期的數(shù)據(jù)。

如果出現(xiàn)錯(cuò)誤,可通過 CTX_USER_INDEX_ERRORS 視圖跟蹤索引錯(cuò)誤。

數(shù)據(jù)庫(kù)根據(jù)索引列更改跟蹤文檔的變更,因此,如果您希望強(qiáng)制 Oracle Text 重新為某些文檔建立索引,可以更新相應(yīng)行的索引列,如下所示:

UPDATE files SET path=path WHERE id = 4;

這將在同步索引時(shí)更新 id 為 4 的文件的索引關(guān)鍵字。

就這樣!


Marko Asplund 是從事基于 Web 的 Java 應(yīng)用程序的技術(shù)顧問。Marko 的興趣包括企業(yè)軟件解決方案和體系結(jié)構(gòu)、信息安全以及數(shù)據(jù)庫(kù)技術(shù)等。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多