使用OracleText构建全文搜索应用程序

使用OracleText构建全文搜索应用程序,第1张

Oracle Text 是一种功能强大的搜索技术 它内置于 Oracle 数据库的所有版本(包括免费提供的快捷版 (XE))中 它所提供的开发 API 使软件开发人员能够轻松实现功能齐备的内容搜索应用程序

Oracle Text 可用于搜索结构化和非结构化文档 是对 SQL 通配符匹配的补充 Oracle Text 支持使用基本的布尔运算符(AND OR NOT NEAR 等)将多个搜索条目组合到一起 此外 它还具有更高级的功能 如 soundex 和模糊搜索 以及结果排序等 该技术支持数百种文件类型 包括 Microsoft Office 和 PDF Oracle Text 适合多种与搜索相关的使用情况和存储结构 Text 的应用领域包括电子商务 文档和记录管理 以及问题跟踪等 可检索的文本可以结构化形式驻留在数据库中 也可以非结构化形式驻留在本地文件系统中或 Web 上

Oracle Text 提供完整的基于 SQL 的搜索 API 该 API 包含自定义查询运算符 DDL 语法扩展 一组 PL/SQL 过程和数据库视图 通过 Text API 应用程序开发人员可完全控制索引 查询 安全 演示以及有时会需要的软件配盯茄置 在开发即需即用的非自定义软件时尤为如此 通过即需即用的软件产品 您希望使软件的配置尽可能简约 即使这意味着要在产品开发中多做一些前期工作也是如此 降低应用程序的复杂性通常会在产品生命周期的后期 尤其是在支持 维护和未来产品开发阶段中见到成效

Oracle Text 还支持文档级授权 而文档级授权通常很难在统一的同时保持高性能 借助 Text 组合了关系数据与非结构化数据的混和查询也得到了很好的支持 对于授权 这意味着您可以将全文搜索和授权合并到一个查询中 独立结果集和获得最终结果所需的过滤阶段的数量可最大程度地缩耐链减 从而简化了应用程序的开发 Oracle Text 使应用程序开发人员从繁琐的开发中解脱出来 可以集中精力进行性能优化

Oracle Text 也是编程语言不可知的 并且也可以同样卓越的表现为 PHP 以及 Java 应用程序工作

前一段时间 我需要提高企业内容管理 (ECM) 系统的搜索功能 我首先对 Oracle Text 的使用进行了评估 评估证明 Oracle Text 是一种构建应用程序搜索非常可行的技术 它具有高级搜索功能 支持大量不同的文件类型 可高度自定义 同时高度可伸缩 原有搜索技术的一个缺点是 您需要在数据库外部运行文件内容搜索 然后运行数据库元数据搜索 对结果进行授权 最后 合并独立的结果集 使用 Oracle Text 所有这些 *** 作都可以在数据库中进行 ECM 系统已经使用 Oracle 数据库来存储元数据 因为此项技术已经推出 因此客凯亩察户自然会选择使用 而且它也不会给客户增加任何成本

在数据库中执行自由文本搜索查询的简单方法类似于

SELECT * FROM issues WHERE LOWER(author) LIKE  %word %  AND LOWER(author) LIKE  %word %  

使用这种方法 每一列都需要与每个关键字单独进行匹配 在每一列中 可以任何顺序与关键字进行匹配 然而 关系数据库的设计使得它不会像上面那样有效地执行查询 而且使用这种方法会产生极其不可伸缩的应用程序 当然 您可以设计自己的索引和搜索解决方案 但是 那样您可能不会优化使用您的资源 在您已经为将搜索技术作为数据库的一部分付出了成本的情况下尤为如此

本文讨论 Oracle Text 在虚拟的问题跟踪应用程序中的使用 在这个应用程序中 用户可以创建一些包含元数据和可选附加文件的问题 该应用程序利用 Oracle Text 实现元数据和可选附加文件内容的全文搜索功能

此处给出的示例已经在 Linux 的 Oracle 数据库 XE 上进行了测试 这些示例应该同样也可在其他 Oracle 平台上运行良好

索引进程与搜索

Oracle Text 为可检索的数据项建立索引之后 用户才能够通过搜索查找内容 编制索引是确保搜索性能的常用方法 Oracle Text 的索引进程是根据管道建模的 在这个管道中 从数据存储检索来的数据项经过一系列转换之后 其关键字会添加到索引中 该索引进程分为多个阶段 每个阶段都由一个单独的实体来处理 并可由应用程序开发人员来配置

Oracle Text 具有适合不同用途的不同索引类型 对于大型文档的全文搜索 适合使用 CONTEXT 索引类型 该索引进程包括以下几个阶段

数据检索 只是将数据从数据存储(例如 Web 页面 数据库大型对象或本地文件系统)中取出 然后作为数据流传送到下一个阶段 过滤 过滤器负责将各种文件格式的数据转换为纯文本格式 索引管道中的其他组件只能处理纯文本数据 不能识别 Microsoft Word 或 Excel 等文件格式 分段 分段器添加关于原始数据项结构的元数据 词法分析 根据数据项的语言将字符流分为几个字词 索引 最后一个阶段将关键字添加到实际索引中

索引构建完成后 应用程序即可通过普通的 SQL 查询执行最终用户输入的搜索

安装 Oracle Text

在默认情况下 Oracle Text 随 Oracle 数据库 XE 一起安装 如何使用的是其他数据库版本 您需要自己安装 Oracle Text 功能 安装了此功能后 您只需创建一个普通的数据库用户 并赋予该用户 CTXAPP 角色 这样 用户即可执行特定的索引管理过程

CREATE USER ot  IDENTIFIED BY ot GRANT connect resource  ctxapp TO ot

文件索引

此处 您要创建一个文本表 用于为存储在问题跟踪系统中的附加文件内容建立索引 附加文件存储在文件系统中 除了应用程序的数据模型所需的列之外 文本基表还包括一个绝对文件路径和一个格式列

CREATE TABLE files ( id NUMBER PRIMARY KEY issue_id NUMBER path VARCHAR( ) UNIQUE ot_format VARCHAR( ) )INSERT INTO files VALUES (     /tmp/oracletext/found txt  NULL)INSERT INTO files VALUES (     /tmp/oracletext/found doc  NULL)INSERT INTO files VALUES (     /tmp/oracletext/notfound txt   IGNORE )

此处 ot_format 的值是 Oracle Text 在索引过程中解析出来的 NULL 值表明系统会为文件自动选择一个过滤器 而如果值为 IGNORE 系统会跳过整个文件

可以使用以下语句创建文本索引

CREATE INDEX file_index ON files(path) INDEXTYPE IS ntext PARAMETERS ( datastore ctxsys file_datastore format column ot_format )

该语句将启动索引进程 索引进程将通过存储在基表中的路径在文件系统中检索文件 然后对内容进行过滤并建立索引 这样便创建了一个区分大小写并具有精确匹配语义的 CONTEXT 索引 该索引进程可以多种方式进行自定义 例如支持前缀和后缀匹配

虽然大部分时间过滤阶段无需为每个文件指定文件格式即可很好地运行 但是 在基表中添加这一列可以对索引进程进行进一步控制 例如 使用格式列 您可以跳过某些文件类型不为其建立索引 当您只想正式支持应用程序中 Oracle Text 所支持的部分文件格式时 这一列非常有用

Oracle Text 还可用于元数据的全文搜索 在示例应用程序中 有一个名为 issues 用于存储问题元数据的表 该表的定义如下

CREATE TABLE issues ( id NUMBER summary VARCHAR( ) description CLOB author VARCHAR( ) ot_version VARCHAR( ) )

ot_version 列为索引列 可用于强制为特定文档重新建立索引 该表可使用测试数据填充

INSERT INTO issues VALUES (   Jane   Text does not make tea Oracle Text is unable to make morning tea   )INSERT INTO issues VALUES (   John   It es in the wrong color I want to have Text in pink   )

用户索引

Oracle Text 可为来自不同数据源的数据建立索引 Oracle Text 可用于问题跟踪系统 提供对问题元数据的全文搜索 在默认情况下 您可为单个列中的值建立索引 但是 如果要合并多个表的数据 您需要创建一个自定义的 PL/SQL 过滤器过程 我将演示如何创建这样的过程 这个过程将起到存储抽象的作用 然后 该索引进程将迭代文本表中所有的行 为每一行调用过滤器过程 过滤器过程将返回所有与问题相关的有待建立索引的文本

 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 c  IN (SELECT author  summary  description FROM issues WHERE rowid = rid) LOOP dbms_lob writeappend(tlob  LENGTH(c summary)+  c summary ||    )dbms_lob writeappend(tlob  LENGTH(c author)+  c author ||    )dbms_lob writeappend(tlob  LENGTH(c description)  c description)END LOOPEND issue_filterEND 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 ntext PARAMETERS ( datastore issue_store )

搜索

CONTAINS 运算符用于搜索 CONTEXT 索引 虽然 CONTAINS 运算符语法的确支持 soundex 匹配等更高级的功能 但在这些示例中 我们只用了简单的布尔运算符来合并关键字 对于 Oracle Text 支持的语言 模糊匹配和词根还原都是默认启用的 要利用这些高级搜索功能 只需将 fuzzy() 或 $ 查询运算符分别与 CONTAINS 运算符结合使用即可 通配符字符可用于前缀和后缀匹配的 CONTAINS 查询 下面是一些简单的查询示例

SELECT id FROM issues WHERE CONTAINS(ot_version   color AND pink   ) >  SELECT id FROM issues WHERE CONTAINS(ot_version   jane OR john   ) > 

索引维护

由于基表数据是由索引复制的 因此这些数据需要定期与索引进行同步 在 CTX_DDL PL/SQL 程序包中可以发现索引维护过程 下面给出了一个示例 显示如何更新索引以反映基表更改

EXECUTE ctx_ddl sync_index( issue_index   M )

该同步过程为 *** 作提供了索引名称和使用的内存量 也可以让数据库定期自动执行此项任务 您也可以选择使用 *** 作系统或其他计划工具来启动同步 例如 在 Unix 系统上 可安排以下 shell 脚本与 Cron 作业 使系统按计划执行同步

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

CTX_DDL 程序包还包含其他有用的过程 例如索引优化 用于消除索引碎片和清除过期的数据

如果出现错误 可通过 CTX_USER_INDEX_ERRORS 视图跟踪索引错误

数据库根据索引列更改跟踪文档的变更 因此 如果您希望强制 Oracle Text 重新为某些文档建立索引 可以更新相应行的索引列 如下所示

UPDATE files SET path=path WHERE id = 

lishixinzhi/Article/program/Oracle/201311/18082

除非使用并行Oracle服务器选项,否则每个Oracle数据库都有一个实例与之相关,一个数据库被唯一的一个实例装载。实例结构允许RDBMS同时对来自多个用户的不同种类事务的请求提供服务,与此同时提供一流的性能、容错性、数据的一致性和安全性。值得注意的是,这里定义的术语“进程”是指在没有用户干预的情况下正在运行的任务。你的 *** 作系统可能将之称作“进程”,或者使用其他术语,例如任务、作业、线程和其他类似的术语。在UNIX实现多任务 *** 作系统后,实例是松散的结构方式。在一起工作的离散的进程在实现实例的目标的RDBMS中完成指定的任务。每一个进程都有各自的一个内存块,该内存块用于保存私有变量、地址堆栈和其他运行时的信息。进程间使用公共共享区并在公共共享区内完成它们的工作。公共共享区是能够在同一时间内被不同程序和不同进程读写的一块内存区。该内存块称为系统全局区(SGA)。因为SGA驻留在一扮腊慧个共享内存段中,所以它经常被称作共享全局区。你可以认为后台进程就像数据库的手,直接处理数据库的组件;你也可以认为SGA就像大脑,在必要时间接地调度手处理它厅答们的信息与存储检索。SGA参与发生在数据库中全部的信息和服务器的处理。单用户的Oracle配置(例如PersonalOracleLite),不使用多进程执行数据库的功能。相反,所有的数据库功能由一个Oracle进程完成。由于这个原因,单用户也称为单进程Oracle。1)创建一个Oracle实例(非安装阶段)。2)由实例安装数据库(安装阶段)。3)打开数据库(打开阶段)。Oracle实例在数据库启动的非安装阶段创建,当数据库经过非安装阶段,读取init.ora参数文件,启动后台进程,初始化系统全局区(SGA)。init.ora文件定义了实例的配置,包括内存结构的大小和启动后台进程的数量和类型等。实例名根据环境变量OracleSID设置,它不一定要与打开的数据库名称相同(但是习惯上通常如此)。下一阶段称为安装阶段。init.ora文件中的控局肆制文件参数值决定数据库的安装实例。在安装阶段,读取控制文件并使其成为可访问的,可以对控制文件内存储的数据进行查询和修改。最后的阶段就是打开数据库。在这一阶段,其名字存储在控制文件中的数据库文件以排它使用方式被实例锁定,使数据库能够被普通用户访问。打开是数据库的正常 *** 作状态。在数据库打开之前,只有DBA能访问数据库,且只能通过服务器管理器对其进行访问。为了改变数据库的 *** 作状态,必须作为内部连接到数据库,或拥有SYSDBA特权。当数据库从关闭状态到打开状态时,你可以明确地单步调试数据库的每一个 *** 作状态,但当关闭数据库时,只能从当前运行状态转到完全关闭状态。例如,可以在服务器管理器工具中执行STARTUP NOMOUNT命令,这将使数据库处在非安装阶段,接下来可以运行ALTER DATABASE MOUNT或者运行ALTER DATABASE OPEN命令以单步调试到 *** 作阶段。无论是在何种 *** 作状态下,如果执行SHUTDOWN命令,将完全关闭数据库。例如,数据库不能从打开状态转到安装状态。没有安装数据库的实例被称为空闲的—它使用内存,但不做任何工作。一个实例只能唯一地与一个数据库连接源码天空,而且除非使用并行服务器,否则对一个数据库也只分配一个实例。实例是数据管理的核心—它做所有的工作,而数据库存储所有的数据。

分类: 教育/科学 >>外语学习

问题描述:

这个句子是什么意思,请各位大虾给我详细解释一下

解析:

我在网上看过这样的说明,你也看一下吧,不知道对你有没有用!

首先,Oracle的字典表和视图基本上可以分为三个层次。

1.X$表

这一部分表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序动态创建。

这部分表对数据库来说至关重要,孙野磨所以Oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许。

如果显示授权你会收到如下错误:

SQL>grant select on x$ksppi to eygle

grant select on x$ksppi to eygle

*

ERROR at line 1:

ORA-02030: can only select from fixed tables/views

2.GV$和V$视图

从Oracle8开始,GV$视图开则斗始被引入,其含义为Global V$.

除了一些特例以外,每个V$视图都有一个对应的GV$视图存在。

GV$视图的产生是为了满足OPS环境的需要,在OPS环境中,查询GV$视图返回所有实例信息,而每个V$视图基于GV$视图,增加了INST_ID列判断后建立,只包含当前连接实例信息。

注意,每个V$视图都包含类似语句:

where inst_id = USERENV(’Instance’)

用于限制返回当前实例信息。

我们从GV$FIXED_TABLE和V$FIXED_TABLE开始

SQL>select view_definition from v_$fixed_view_definition

where view_name=’V$FIXED_TABLE’

VIEW_DEFINITION

----------------------------------------------------------

select NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE

where inst_id = USERENV(’Instance’)

这里我们看到V$FIXED_TABLE基于GV$FIXED_TABLE创建。

SQL>select view_definition from v_$fixed_view_definition

where view_name=’GV$FIXED_TABLE’

VIEW_DEFINITION

-----------------------------------------------------------

select inst_id,kqftanam, kqftaobj, ’TABLE’, indx from x$kqfta

union all

select inst_id,kqfvinam, kqfviobj, ’VIEW’, 65537 from x$kqfvi

union all

select inst_id,kqfdtnam, kqfdtobj, ’TABLE’, 65537 from x$kqfdt

这样我们找到了GV$FIXED_TABLE视图的创建语句,该视图基于X$表创建。

3.GV_$,V_$视图和V$,GV$同义词

这些视图是通过catalog.ql创建脊凳。

当catalog.sql运行时:

create or replace view v_$fixed_table as select * from v$fixed_table

create or replace public synonym v$fixed_table for v_$fixed_table

create or replace view gv_$fixed_table as select * from gv$fixed_table

create or replace public synonym gv$fixed_table for gv_$fixed_table

我们注意到,第一个视图V_$和GV_$首先被创建,v_$和gv_$两个视图。

然后基于V_$视图的同义词被创建。

所以,实际上通常我们访问的V$视图,其实是指向V_$视图的同义词。

而V_$视图是基于真正的V$视图(这个视图是基于X$表建立的)。

而v$fixed_view_definition视图是我们研究Oracle对象关系的一个入口,仔细理解Oracle的数据字典机制,有助于深入了解和学习Oracle数据库知识。

4.再进一步

1).X$表

关于X$表,其创建信息我们也可以从数据字典中一窥究竟。

首先我们考察bootstrap$表,该表中记录了数据库启动的基本及驱动信息。

SQL>select * from bootstrap$

LINE# OBJ# SQL_TEXT

------------------------------------------------------------------

-1 -1 8.0.0.0.0

0 0 CREATE ROLLBACK SEGMENT SYSTEM STORAGE ( INITIAL 112K NEXT 1024K

MINEXTENTS 1 M

8 8 CREATE CLUSTER C_FILE#_BLOCK#("TS#" NUMBER,"SEGFILE#" NUMBER,

"SEGBLOCK#" NUMBER)

9 9 CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE 10

INITRANS 2 MAXT

14 14 CREATE TABLE SEG$("FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT

NULL,"TYPE#" NUMBE

5 5 CREATE TABLE CLU$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"TS#"

NUMBER NOT NULL

6 6 CREATE CLUSTER C_TS#("TS#" NUMBER) PCTFREE 10 PCTUSED 40 INITRANS

2 MAXTRANS 255

7 7 CREATE INDEX I_TS# ON CLUSTER C_TS# PCTFREE 10 INITRANS 2 MAXTRANS

255 STORAGE (

....

这部分信息,在数据库启动时最先被加载,跟踪数据库的启动过程,我们发现数据库启动的第一个动作就是:

create table bootstrap$ ( line# number not null, obj# number not null,

sql_text varchar2(4000) not null) storage (initial 50K objno 56 extents

(file 1 block 377))

这部分代码是写在Oracle应用程序中的,在内存中创建了bootstrap$以后,Oracle就可以从file 1,block 377上读取其他信息,创建重要的数据库对象。从而根据这一部分信息启动数据库,这就实现了数据库的引导,类似于 *** 作系统的初始化。 这部分你可以参考biti_rainy的文章。

X$表由此建立。这一部分表可以从v$fixed_table中查到:

SQL>select count(*) from v$fixed_table where name like ’X$%’

COUNT(*)

----------

394

共有394个X$对象被记录。

2).GV$和V$视图

X$表建立以后,基于X$表的GV$和V$视图得以创建。

这部分视图我们也可以通过查询V$FIXED_TABLE得到。

SQL>select count(*) from v$fixed_table where name like ’GV$%’

COUNT(*)

----------

259

这一部分共259个对象。

SQL>select count(*) from v$fixed_table where name like ’V$%’

COUNT(*)

----------

259

同样是259个对象。

v$fixed_table共记录了394 + 259 + 259 共 912 个对象。

我们通过V$PARAMETER视图来追踪一下数据库的架构:

SQL>select view_definition from v$fixed_view_definition a where

a.VIEW_NAME=’V$PARAMETER’

VIEW_DEFINITION

-------------------------------------------------------------------

select NUM , NAME , TYPE , VALUE , ISDEFAULT , ISSES_MODIFIABLE ,

ISSYS_MODIFIA

BLE , ISMODIFIED , ISADJUSTED , DESCRIPTION, UPDATE_COMMENT from

GV$PARAMETER wh

ere inst_id = USERENV(’Instance’)

我们看到V$PARAMETER是由GV$PARAMETER创建的。

SQL>select view_definition from v$fixed_view_definition a where

a.VIEW_NAME=’GV$PARAMETER’

VIEW_DEFINITION

-------------------------------------------------------------------

select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl,ksppstdf, decode

(bitand(kspp

iflg/256,1),1,’TRUE’,’FALSE’), decode(bitand(ksppiflg/65536,3),1,

’IMMEDIATE’,2,

’DEFERRED’, 3,’IMMEDIATE’,’FALSE’), decode(bit and(ksppstvf,7),

1,’MODIFIED’,4,’SYSTEM_MOD’,’FALSE’), decode(bitand(ksppstvf,2

,2,’TRUE’,’FALSE’), ksppdesc, ksppstcmnt from x$ksppi x, x$ksppcv

y where (x.indx = y.indx) and ((translate(ksppinm,’_’,’#’) not

like ’#%’) or (ksppstdf = ’FALSE’))

在这里我们看到GV$PARAMETER来源于x$ksppi,x$ksppcv两个X$表。 x$ksppi,x$ksppcv 基本上包含所有数据库可调整参数,v$parameter展现的是不包含"_"开头的参数。以"_"开头的参数我们通常称为隐含参数,一般不建议修改,但很多因为功能强大经常使用而广为人知。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12564743.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-26
下一篇2025-08-26

发表评论

登录后才能评论

评论列表(0条)

    保存