SQL > exec ctx_ddl.create_preference ('my_test_lexer','chinese_lexer') ;
PL/SQL 过程成功完成
SQL > EXEC ctx_ddl.create_preference ('my_test_mds','MULTI_COLUMN_DATASTORE') ;
PL/SQL 过程成功完成
SQL > exec ctx_ddl.set_attribute ('my_test_mds'、 '列'、 ' base_keyword,base_title,base_content') ;
PL/SQL 过程成功完成
SQL >
创建索引 mc_idx ON tb_knowledge_base_bk(base_title) 为索引类型是 ctxsys。上下文参数 (数据存储 my_test_mds LEXER my_test_lexer')
选择 * tb_knowledge_base_bk t 从哪里 contains(t.base_title,'转速',1) > 0 ;
选择 * 从博士 $MC_IDX$ ;
译文:
http://gjbxx110.blog.51cto.com/794841/264880
数据库版本:10g
数据库操作系统: linux as4
表test1,
创建表 TEST1
(
CHINAME VARCHAR2(4000 CHAR)
ABNAME VARCHAR2(50 CHAR)
地址 VARCHAR2(200 CHAR)
市 VARCHAR2(30 CHAR)
X NUMBER(10,5),
Y NUMBER(10,5)
POIID 号
身份证号码
)。
指定分词
参考资料:
http://docs.oracle.com/cd/B19306_01/text.102/b14218/cdatadic.htm
数据存储类型
使用数据存储类型来指定如何存储您的文本。若要创建数据存储首选项,必须使用下面的数据存储类型之一:
数据存储类型 | 何时使用 |
---|---|
DIRECT_DATASTORE | 数据存储在文本列的内部。每一行作为一个单独的文档编制索引。 |
MULTI_COLUMN_DATASTORE | 在多个列中的文本表中存储数据。列连接起来以创建一个虚拟的文档,另一个用于每个行。 |
DETAIL_DATASTORE | 数据存储在文本列的内部。文档包含存储在细节表中的文本列中含有标题信息存储在主表中的一个或多个行。 |
FILE_DATASTORE | 数据从外部存储在操作系统的文件。文件名存储在文本列中,另一个用于每个行中。 |
NESTED_DATASTORE | 嵌套表中存储数据。 |
URL_DATASTORE | 数据从外部存储在位于 intranet 或 Internet 上的文件中。统一资源定位器 (Url) 存储在文本栏中。 |
USER_DATASTORE | 在索引时合成了文件,由用户定义的存储过程。 |
2 oracle 文本索引元素
这一章描述了您可以使用来创建您的 Oracle 文本索引的各种元素。
概述
当您使用创建索引创建索引或修改索引管理指数时,可以选择在参数字符串中指定索引的偏好、 stoplists、 和节组。指定一个首选项、 非索引字表或节组答案有关 Oracle 文本索引的文本方式的以下问题之一:
首选项类 | 回答了这个问题 |
---|---|
数据存储区 | 您的文档的存储方式? |
筛选器 | 转换为纯文本,这些文件的如何? |
词法分析器 | 什么语言正在被编制索引? |
单词表 | 如何干和模糊查询是如何扩大呢? |
存储 | 应如何存储索引表? |
阻止列表 | 哪些词或主题是不会索引吗? |
节组 | 查询部分启用,和如何在文档内定义节吗? |
本章介绍如何设置每个首选项。可以通过在这一章中所描述的类型之一创建首选项启用选项。
例如,若要指定您的文档存储在外部文件中,可以创建称为mydatastore
使用FILE_DATASTORE类型的数据存储区偏好。您作为数据存储首选项在CREATE
INDEX
的参数子句中指定mydatastore
.
创建首选项
若要创建数据存储区,词法分析器、 筛选、 分类、 单词表或存储首选项,您可以使用 CTX_DDL。CREATE_PREFERENCE程序,并指定在这一章中所描述的类型之一。对于某些类型,您还可以设置 CTX_DDL 属性。SET_ATTRIBUTE程序。
索引类型名称您可以使用创建索引偏好的索引对象的类。一种类型,因此,是一个抽象的 ID,而偏好是一个对应于一种类型的实体。许多系统定义的首选项具有相同的名称作为类型 (例如, BASIC_LEXER
),但不是能保证准确对应 (例如, DEFAULT_DATASTORE
偏好使用DIRECT_DATASTORE
类型,和没有对应的CHARSET_FILTER
类型的系统偏好)。要小心在假设的存在或性质的索引类型或系统首选项。
您指定索引首选项与CREATE INDEX
和ALTER INDEX
;索引首选项决定如何创建您的索引。例如,词法分析器首选项指示要编入索引的文本的语言。您可以创建并指定您自己 (用户定义) 的偏好或您可以使用系统定义的首选项。
若要创建非索引字表,请使用 CTX_DDL。CREATE_STOPLIST。您可以添加非索引字表与CTX_DDL.ADD_STOPWORD
.
若要创建分区组,请使用 CTX_DDL。CREATE_SECTION_GROUP ,并指定一个节组类型。你可以添加与CTX_DDL. ADD_ZONE_SECTION
或CTX_DDL.ADD_FIELD_SECTION
.
数据存储类型
使用数据存储类型来指定如何存储您的文本。若要创建数据存储首选项,必须使用下面的数据存储类型之一:
数据存储类型 | 何时使用 |
---|---|
DIRECT_DATASTORE | 数据存储在文本列的内部。每一行作为一个单独的文档编制索引。 |
MULTI_COLUMN_DATASTORE | 在多个列中的文本表中存储数据。列连接起来以创建一个虚拟的文档,另一个用于每个行。 |
DETAIL_DATASTORE | 数据存储在文本列的内部。文档包含存储在细节表中的文本列中含有标题信息存储在主表中的一个或多个行。 |
FILE_DATASTORE | 数据从外部存储在操作系统的文件。文件名存储在文本列中,另一个用于每个行中。 |
NESTED_DATASTORE | 嵌套表中存储数据。 |
URL_DATASTORE | 数据从外部存储在位于 intranet 或 Internet 上的文件中。统一资源定位器 (Url) 存储在文本栏中。 |
USER_DATASTORE | 在索引时合成了文件,由用户定义的存储过程。 |
DIRECT_DATASTORE
DIRECT_DATASTORE
型用于直接在文本列中,为每个行的一份文件中存储的文本。DIRECT_DATASTORE
不具有属性。
支持以下的列类型:CHAR
、 VARCHAR
、 VARCHAR2
、 BLOB
、 CLOB
, BFILE
或XMLType
.
注:
如果你的专栏,BFILE
索引所有者必须有读取权限上使用的BFILEs
的所有目录.DIRECT_DATASTORE CLOB 示例
下面的示例创建一个表,用来存储文本数据的 CLOB 列。然后填充两行文本数据索引所使用的系统定义的偏好CTXSYS.DEFAULT_DATASTORE
.
create table mytable(id number primary key, docs clob); insert into mytable values(111555,'this text will be indexed'); insert into mytable values(111556,'this is a direct_datastore example'); commit; create index myindex on mytable(docs) indextype is ctxsys.context parameters ('DATASTORE CTXSYS.DEFAULT_DATASTORE');
MULTI_COLUMN_DATASTORE
在你的文本存储在多个列中时,请使用此数据存储区。索引,期间系统连接列的文本,添加标签的文本列和索引作为单个文档的文本。类似 XML 的标记是可选的。您还可以设置系统筛选并串联的二进制列。
MULTI_COLUMN_DATASTORE
具有下列属性:
表 2-2 MULTI_COLUMN_DATASTORE 属性
索引和 DML
要索引,必须创建要在CREATE
INDEX
语句中指定的虚拟列。除非在列属性指定它的名称,此列内容不是虚拟文档的一部分。
该指数被同步仅当更新虚拟列。您可以创建触发器传播更改,如果需要的话。
MULTI_COLUMN_DATASTORE 示例
下面的示例创建称为 my_multi
与三个文本列多列数据存储首选项:
begin
ctx_ddl.create_preference('my_multi', 'MULTI_COLUMN_DATASTORE'); ctx_ddl.set_attribute('my_multi', 'columns', 'column1, column2, column3');
end;
MULTI_COLUMN_DATASTORE 筛选器示例
下面的示例创建多列数据存储首选项,并表示bar
列是要筛选与 AUTO_FILTER。
ctx_ddl.create_preference('MY_MULTI','MULTI_COLUMN_DATASTORE'); ctx_ddl.set_attribute('MY_MULTI', 'COLUMNS','foo,bar'); ctx_ddl.set_attribute('MY_MULTI','FILTER','N,Y');
多列数据存储区读取foo
和 bar
列,筛选器bar
的内容然后组成复合文档:
<FOO> foo contents </FOO> <BAR> bar filtered contents (probably originally HTML) </BAR>
不需要指定 N,并不需要为每一列的标志。Y 只需要指定,请用逗号来表示它们适用于哪些列。举个例子:
ctx_ddl.create_preference('MY_MULTI','MULTI_COLUMN_DATASTORE'); ctx_ddl.set_attribute('MY_MULTI', 'COLUMNS','foo,bar,zoo,jar'); ctx_ddl.set_attribute('MY_MULTI','FILTER',',,Y');
这个过滤器只列zoo
.
标记行为
索引,过程中,系统将创建为每个行的虚拟文档。虚拟文档被由串联的上市顺序自动添加的列名称标签的列中的内容。举个例子:
create table mc(id number primary key, name varchar2(10), address varchar2(80)); insert into mc values(1, 'John Smith', '123 Main Street'); exec ctx_ddl.create_preference('mymds', 'MULTI_COLUMN_DATASTORE'); exec ctx_ddl.set_attibute('mymds', 'columns', 'name, address');
这就产生了以下虚拟文本索引:
<NAME> John Smith </NAME> <ADDRESS> 123 Main Street </ADDRESS>
该系统索引标记,忽略自己的标记之间的文本。
作为部分的索引列
索引作为部分这些标记,您可以选择创建字段部分与BASIC_SECTION_GROUP
.
注:
使用MULTI_COLUMN_DATASTORE
时,将创建没有节组。若要创建这些标记的部分,必须创建一个节组。当你使用表达式或函数时,该标记被由表达式前 30 个字符除非使用了一个列别名。
例如,如果您的表达式是作为如下:
exec ctx_ddl.set_attibute('mymds', 'columns', '4 + 17');
然后它产生以下虚拟文本:
<4 + 17> 21 </4 + 17>
如果您的表达式,如下所示:
exec ctx_ddl.set_attibute('mymds', 'columns', '4 + 17 col1');
然后它产生以下虚拟文本:
<col1> 21 <col1>
标记是以大写形式,除非列名或列别名以小写,而双引号包围。举个例子:
exec ctx_ddl.set_attibute('mymds', 'COLUMNS', 'foo');
产生以下虚拟文本:
<FOO> content of foo </FOO>
为小写字母的标记,使用以下方法:
exec ctx_ddl.set_attibute('mymds', 'COLUMNS', 'foo "foo"');
此表达式将生成:
<foo> content of foo </foo>
DETAIL_DATASTORE
对直接存储在数据库中表的详细信息表,位于该主表的索引的文本列的文字使用DETAIL_DATASTORE
类型。
DETAIL_DATASTORE
具有下列属性:
示例主/详细信息表
此示例阐释了主页和详细的表如何彼此相关。
主表的示例
主表中的主/详细信息关系定义的文档。您分配的每个文档的识别号码。下表是示例的主表,称为my_master
:
列名称 | 列类型 | 描述 |
---|---|---|
article_id | 数量 | 文档 ID,唯一的每个文档 (主键) |
作者 | VARCHAR2(30) | 文档的作者 |
标题 | VARCHAR2(50) | 文档的标题 |
身体 | CHAR (1) | 要指定在创建索引中的虚拟列 |
注:
你主表必须包含一个主键列,当您使用DETAIL_DATASTORE
类型。详细信息表的示例
详细信息表包含一个文档,其内容通常存储跨多行的文本。以下详细表my_detail
与主表my_master
article_id
柱有关。此列标识的每个详细信息行 (子文件) 所属的主控文档。
列名称 | 列类型 | 描述 |
---|---|---|
article_id | 数量 | 涉及到主表的文档 ID |
seq | 数量 | 由 article_id 定义的主文档中文档的顺序 |
文本 | VARCHAR2 | 文档文本 |
详细信息表的示例属性
在此示例中, DETAIL_DATASTORE
属性具有以下值:
属性 | 属性值 |
---|---|
二进制文件 | 真实 |
detail_table | my_detail |
detail_key | article_id |
detail_lineno | seq |
detail_text | 文本 |
您使用 CTX_DDL。CREATE_PREFERENCE使用DETAIL_DATASTORE
创建的偏好。您使用 CTX_DDL。SET_ATTRIBUTE要设置此首选项的属性,如前面所述。下面的示例演示如何做到这一点:
begin
ctx_ddl.create_preference('my_detail_pref', 'DETAIL_DATASTORE'); ctx_ddl.set_attribute('my_detail_pref', 'binary', 'true'); ctx_ddl.set_attribute('my_detail_pref', 'detail_table', 'my_detail'); ctx_ddl.set_attribute('my_detail_pref', 'detail_key', 'article_id'); ctx_ddl.set_attribute('my_detail_pref', 'detail_lineno', 'seq'); ctx_ddl.set_attribute('my_detail_pref', 'detail_text', 'text');
end;
主/详细信息索引示例
到索引这个主/详细信息关系中定义的文档CREATE
INDEX
的主表中指定的列。您指定的列必须允许的类型之一。
此示例使用body
列,其功能是能够创建主/详细信息索引,并提高代码的可读性。my_detail_pref
首选项被设置为DETAIL_DATASTORE
,具有所需属性:
CREATE INDEX myindex on my_master(body) indextype is ctxsys.context parameters('datastore my_detail_pref');
在此示例中,您还可以指定要创建索引的title
或author
的列。然而,如果您这样做,这些列的更改将触发重新索引的操作。
FILE_DATASTORE
FILE_DATASTORE
型用于存储在通过本地文件系统访问的文件中的文本。
注:
与某些类型的远程挂载的文件系统,FILE_DATASTORE
可能无法工作。FILE_DATASTORE
具有以下属性:
- 路径
-
指定外部存储在文件系统中的文件的完整目录路径名称。当您指定完整的目录路径,这样时,您只需要在文本列中包括文件的名称。
您可以指定多个路径,路径与在 UNIX 和 Windows 上的 semicolon(;) 由一个冒号 (:) 分隔每个路径。文件的名称存储在文字的表格中的文本列中。
如果您不使用此属性指定外部文件的路径,Oracle 文本需要在文本列中存储的文件名称中包含的路径。
路径属性限制
路径属性具有下列局限性:
-
如果您指定一个路径属性,您只能在索引列中使用一个简单的文件名。你不能将路径属性结合路径作为文件名的一部分。如果在多个文件夹或目录中存在这些文件,你必须离开路径属性的设置,并在索引列中包含文件的完整名称,路径。
-
在 Windows 系统上,文件必须位于本地驱动器上。他们不能在远程驱动器上,是否远程驱动器映射为本地驱动器盘符。
FILE_DATASTORE 示例
本示例创建称为COMMON_DIR
具有/mydocs
路径文件数据存储首选项:
begin ctx_ddl.create_preference('COMMON_DIR','FILE_DATASTORE'); ctx_ddl.set_attribute('COMMON_DIR','PATH','/mydocs'); end;
当您使用填充表mytable
时,您只需要插入文件名。路径属性告诉系统哪里看在索引操作期间。
create table mytable(id number primary key, docs varchar2(2000)); insert into mytable values(111555,'first.txt'); insert into mytable values(111556,'second.txt'); commit;
创建索引,如下所示:
create index myindex on mytable(docs) indextype is ctxsys.context parameters ('datastore COMMON_DIR');
URL_DATASTORE
URL_DATASTORE
型用于存储文本:
-
万维网 (通过 HTTP 或 FTP 访问) 上的文件中
-
在本地文件系统 (通过文件协议访问) 中的文件
你在单个文本字段中存储的每个 URL。
URL 语法
您在文本字段中存储的 url 语法是,如下所示 (用方括号表示可选参数):
[URL:]<access_scheme>://<host_name>[:<port_number>]/[<url_path>]
您指定的access_scheme字符串可以是ftp、 http或文件。举个例子:
http://mymachine.us.oracle.com/home.html
由于这种语法是部分符合 RFC 1738 规范,以下限制适用于 URL 语法:
-
该 URL 必须包含仅可打印的 ASCII 字符。非打印 ASCII 字符和多字节字符必须使用进行转义 %xx表示法,其中xx是特殊字符的十六进制表示形式。
注:
在 URL 中的login:password@
语法是仅支持 ftp 访问方案。
URL_DATASTORE 属性
URL_DATASTORE
具有下列属性:
属性 | 属性值 |
---|---|
超时 | 以秒为单位指定超时值。有效的范围是 15 至 3600 秒。默认值为 30。 |
maxthreads | 指定可以同时运行的线程的最大数目。使用 1and 介于 1024年。默认值为 8。 |
urlsize | 指定的 URL 字符串的最大长度,以字节为单位.使用32 到 65535 之间的数字。默认值为 256。 |
maxurls | 指定 URL 缓冲区的最大大小。使用 32 到 65535 之间的数字。默认值为 256。 |
maxdocsize | 指定最大文件大小。使用 256 和 2147483647 字节 (2 千兆字节) 之间的一个数字。默认值是 2,000,000。 |
从不 | 指定的 http 代理服务器的主机名。(可选) 在窗体hostname:port中指定端口号,用冒号. |
ftp_proxy | 指定 ftp 代理服务器的主机名。(可选) 在窗体hostname:port中指定端口号,用冒号. |
no_proxy | 没有代理服务器指定的域。使用逗号分隔的达 16 域名的字符串。 |
- 超时
-
指定以秒为单位,如连接或读取网络操作在超时并返回到应用程序的超时错误之前等待时间的长度。超时的有效范围是 15 到 3600,默认值为 30。
注:
由于超时处于网络操作水平,总超时可能长于指定超时的时间. - maxthreads
-
指定可以同时运行的线程的最大数目。Maxthreads的有效范围是 1 到 1024年,默认值为 8。
- urlsize
-
指定最大长度以字节为单位,URL 数据存储区支持的 Url 存储在数据库中。如果 URL 超过最大长度,则返回错误。Urlsize的有效范围是 32 到 65535,默认值为 256。
注:
指定为 maxurls 和urlsize的产品值不能超过 5,000,000。换句话说,内存缓冲区的最大大小 (maxurls * urlsize) 为该 URL 是大约 5 兆字节。
- maxurls
-
指定内部的缓冲区可保存为 HTML 文档 (行) 从文本表中检索到的行的最大数目。Maxurls的有效范围是 32 到 65535,默认值为 256。
注:
指定为maxurls和urlsize的产品值不能超过 5,000,000。换句话说,内存缓冲区的最大大小 (maxurls * urlsize) 为该 URL 是大约 5 兆字节。
- 从不
-
指定用作安装了 Oracle 文本的计算机的 HTTP 代理 (网关) 的主机的完全限定的名称。您可以选择指定端口号,用冒号的形式hostname:port.
如果这台机器是在需要通过代理服务器访问位于防火墙外部的 Web 文件的身份验证的 intranet,则必须设置此属性。
- ftp_proxy
-
指定用作安装了 Oracle 文本的计算机的 FTP 代理 (网关) 的主机的完全限定名称。您可以选择指定一个端口号,用冒号的形式hostname:port.
如果这台机器是在需要通过代理服务器访问位于防火墙外部的 Web 文件的身份验证的 intranet,必须设置此属性。
- no_proxy
-
在 intranet 中指定的域 (达十六,单独用逗号) 存在于大多数,如果不是全部,机器的字符串。当其中一个域中的主机名称遇到时,没有请求发送到ftp_proxy和从不为指定的计算机。相反,直接由主机标识在 URL 中,处理了该请求。
例如,如果为no_proxy输入字符串us.oracle.com, uk.oracle.com ,则包含这些域中的主机名的机器的任何 URL 请求不会处理由您的代理服务器。
URL_DATASTORE 示例
本示例创建称为URL_PREF
的从不,no_proxy 和超时属性设置URL_DATASTORE
偏好。对于未设置的属性,则使用缺省值。
begin ctx_ddl.create_preference('URL_PREF','URL_DATASTORE'); ctx_ddl.set_attribute('URL_PREF','HTTP_PROXY','www-proxy.us.oracle.com'); ctx_ddl.set_attribute('URL_PREF','NO_PROXY','us.oracle.com'); ctx_ddl.set_attribute('URL_PREF','Timeout','300'); end;
创建表并将值插入到它:
create table urls(id number primary key, docs varchar2(2000)); insert into urls values(111555,'http://context.us.oracle.com'); insert into urls values(111556,'http://www.sun.com'); commit;
若要创建索引,请指定 URL_PREF 作为数据存储区:
create index datastores_text on urls ( docs ) indextype is ctxsys.context parameters ( 'Datastore URL_PREF' );
USER_DATASTORE
使用USER_DATASTORE
类型来定义索引过程中合成文件的存储的过程。例如,一个用户程序可能合成作者、 日期和文本列到一个文档中,有的作者和日期的信息索引文本的一部分。
USER_DATASTORE
具有下列属性:
属性 | 属性值 |
---|---|
程序 | 指定合成要编制索引的文档的过程。
此过程可以由任何用户拥有,并且必须是可由索引所有者执行。 |
先前 | 指定程序的第二个参数的数据类型。有效值为CLOB , BLOB , CLOB_LOC , BLOB_LOC 或VARCHAR2 。默认值为 CLOB。
当您指定 |
- 程序
-
指定合成要编制索引的文档的程序的名称。本规格书必须在窗体中,PROCEDURENAME 或软件包名称。PROCEDURENAME。您还可以指定架构所有者名称。
您指定的程序必须具有两个参数定义如下:
procedure (r IN ROWID, c IN OUT NOCOPY <output_type>)
第一个参数r必须是类型
ROWID
。第二个参数c必须是类型output_type。NOCOPY
是指示 Oracle 文本,如果有可能通过引用传递参数 c 的编译器提示。注::
过程的名称和它的参数可以被命名为任何名称。为简单起见此示例中使用的参数 r 和 c。存储的过程是索引的每一行调用一次。鉴于当前行的 rowid,程序必须编写文档的文本变成第二个参数,您先前使用指定的类型.
索引之后编辑程序
如果您更改或编辑存储的过程,在此基础上的索引不会向外通知,您必须手动重新创建此类的索引。因此,如果该存储过程使用的其它列,这些列的值更改,不会重新生成索引的行。仅当索引的列更改时重新编制索引行。
CLOB 例 USER_DATASTORE
作者、 标题和文本字段分开,如articles
表定义如下所示的表,请考虑:
create table articles( id number, author varchar2(80), title varchar2(120), text clob );
作者和标题的字段是要索引的文档文本的一部分。假定用户appowner
写道合成一个文件从文本、 作者和标题字段的用户数据存储接口的存储的过程:
create procedure myproc(rid in rowid, tlob in out clob nocopy) is begin for c1 in (select author, title, text from articles where rowid = rid) loop
dbms_lob.writeappend(tlob, length(c1.title), c1.title); dbms_lob.writeappend(tlob, length(c1.author), c1.author); dbms_lob.writeappend(tlob, length(c1.text), c1.text);
end loop; end;
此过程接受 rowid 和临时的CLOB
定位器,并串联成临时CLOB
的这篇文章的所有列。For 循环执行只有一次。
用户appowner
创建首选项,如下所示:
begin
ctx_ddl.create_preference('myud', 'user_datastore'); ctx_ddl.set_attribute('myud', 'procedure', 'myproc'); ctx_ddl.set_attribute('myud', 'output_type', 'CLOB');
end;
当appowner
在articles(text)
使用这种偏好上创建索引时,索引操作看到作者和标题文档文本中。
USER_DATASTORE 与 BLOB_LOC 的示例
下面的过程可能会用OUTPUT_TYPE
BLOB_LOC
:
procedure myds(rid in rowid, dataout in out nocopy blob) is l_dtype varchar2(10); l_pk number; begin select dtype, pk into l_dtype, l_pk from mytable where rowid = rid; if (l_dtype = 'MOVIE') then select movie_data into dataout from movietab where fk = l_pk; elsif (l_dtype = 'SOUND') then select sound_data into dataout from soundtab where fk = l_pk; end if; end;
用户appowner
创建首选项,如下所示:
begin
ctx_ddl.create_preference('myud', 'user_datastore'); ctx_ddl.set_attribute('myud', 'procedure', 'myproc'); ctx_ddl.set_attribute('myud', 'output_type', 'blob_loc');
end;
NESTED_DATASTORE
使用嵌套数据存储类型存储为嵌套表中的行的索引文档。
当使用嵌套的表数据存储区时,你必须虚拟栏编制索引,因为可扩展索引框架不允许索引嵌套的表的列。请参阅示例。
嵌套表的 DML 不会自动传播到用于索引的虚拟列。DML 嵌套表上,将其传播到虚拟列,为您的应用程序代码或触发器必须显式更新虚拟列。
筛选器索引的默认值基于nested_text
列的类型。
在验证期间,该类型存在的甲骨文文字检查和属性您指定为 nested_lineno 和 nested_text 中的嵌套的表类型存在。Oracle 文本不检查命名的嵌套的表的列索引表中存在。
NESTED_DATASTORE 示例
本节演示使用索引的文档存储为嵌套表中的行的NESTED_DATASTORE
类型的示例。
创建嵌套的表
下面的代码创建一个嵌套的表和嵌套表存储表 mytab:
create type nt_rec as object ( lno number, -- line number ltxt varchar2(80) -- text of line ); create type nt_tab as table of nt_rec; create table mytab ( id number primary key, -- primary key dummy char(1), -- dummy column for indexing doc nt_tab -- nested table ) nested table doc store as myntab;
将值插入到嵌套表
下面的代码将值插入到具有 id 等于 1 的父行的嵌套表。
insert into mytab values (1, null, nt_tab()); insert into table(select doc from mytab where id=1) values (1, 'the dog'); insert into table(select doc from mytab where id=1) values (2, 'sat on mat '); commit;
创建嵌套的表格首选项
下面的代码设置的首选项和属性为NESTED_DATASTORE
根据定义的嵌套的表类型nt_tab
和父表mytab
:
begin -- create nested datastore pref ctx_ddl.create_preference('ntds','nested_datastore'); -- nest tab column in main table ctx_ddl.set_attribute('ntds','nested_column', 'doc'); -- nested table type ctx_ddl.set_attribute('ntds','nested_type', 'scott.nt_tab'); -- lineno column in nested table ctx_ddl.set_attribute('ntds','nested_lineno','lno'); --text column in nested table ctx_ddl.set_attribute('ntds','nested_text', 'ltxt'); end;
筛选器类型
使用筛选器类型来创建确定文本索引的筛选方式的首选项。筛选器允许字处理和格式化的文档,以及纯文本、 HTML 和 XML 文档进行索引。
对于已格式化的文档,Oracle 文本以本机格式存储文档和使用筛选器来建立临时的纯文本或 HTML 版本的文档。Oracle 文本索引词来自纯文本或 HTML 格式的文档版本。
若要创建筛选器首选项,必须使用以下类型之一:
筛选器 | 当使用 |
---|---|
CHARSET_FILTER | 字符集转换筛选器 |
AUTO_FILTER | 汽车滤清器过滤格式化的文件, |
NULL_FILTER | 无过滤所需。用于索引的纯文本、 HTML 或 XML 文档 |
MAIL_FILTER | 使用MAIL_FILTER 来转换 RFC 822,RFC 2045 消息中对可转位刀片的文本。 |
USER_FILTER | 用户定义的外部滤波器用于自定义筛选 |
PROCEDURE_FILTER | 用户定义的存储过程筛选器,用于自定义筛选。 |
CHARSET_FILTER
使用CHARSET_FILTER
从字符集到字符集数据库所用的非数据库字符集转换文件。
CHARSET_FILTER
具有以下属性:
属性 | 属性值 |
---|---|
字符集 | 指定源字符集的全球化支持名称。
如果您指定 UTF16AUTO,此筛选器自动检测如果字符集是 UTF16 大-或小端字节序。 为日语字符设置自动检测指定 JAAUTO。此筛选器自动检测中 JA16EUC 或 JA16SJIS 的自定义字符规格,并将转换为数据库字符集。此筛选器是有用在日语中,在您的数据文件具有混合字符集。 |
请参见:
有关受支持的全球化支持字符集的详细信息oracle 数据库全球化支持指南设置。UTF 16 大-和小端字节序检测
如果你的字符集是 UTF-16,则可以指定 UTF16AUTO 自动检测大或小字节数据。甲骨文文字这样通过检查文档行的第一次的两个字节。
如果前两个字节是 0xFE,0xFF,文档公认的小端字节序,减去那些两个字节的文档的其余部分通过索引。
如果前两个字节 0xFF,0xFE,文档公认的大端字节序,减去那些两个字节的文档的其余部分通过索引。
如果前两个字节是什么,该文档被假定为大端字节序和整篇文档,包括前两个字节代代相传的索引。
索引混合字符设置列
混合的字符设置的列是一种存储不同字符集的文档。例如,文本表可能以 utf8 表示,将某些文档存储在 WE8ISO8859P1 和其他人。
要索引的表中不同字符集的文档,必须与字符设置列创建你的基表。在本专栏中,可以指定文档字符集在每行的基础上。要编制索引的文档,Oracle 文本转换数据库字符集的文档。
字符集与CHARSET_FILTER
的改建工程。当字符集列中为NULL
或不承认时,Oracle 文本假定源字符集是charset属性中指定。
注:
字符集转换也与AUTO_FILTER
的作品当文件格式列设置为TEXT
.索引混合字符设置示例
例如,与字符集列创建表:
create table hdocs ( id number primary key, fmt varchar2(10), cset varchar2(20), text varchar2(80) );
创建该筛选器首选项:
begin cxt_ddl.create.preference('cs_filter', 'CHARSET_FILTER'); ctx_ddl.set_attribute('cs_filter', 'charset', 'UTF8');end
插入纯文本文档和命名的字符集:
insert into hdocs values(1, 'text', 'WE8ISO8859P1', '/docs/iso.txt'); insert into hdocs values (2, 'text', 'UTF8', '/docs/utf8.txt'); commit;
字符集列创建索引和名称:
create index hdocsx on hdocs(text) indextype is ctxsys.context parameters ('datastore ctxsys.file_datastore filter cs_filter format column fmt charset column cset');
AUTO_FILTER
AUTO_FILTER
是一个通用的过滤器,过滤器大多数文件格式,包括 PDF 和 Microsoft Word ™ 文件。将它用于单格式和混合格式的列进行索引。此筛选器自动绕过纯文本、 HTML、 XHTML、 SGML 和 XML 文件。
请参见:
AUTO_FILTER
和学会更多关于如何设置您的环境使用此筛选器支持的格式的列表,请参阅附录 B,"Oracle 文本支持文档格式".注:
AUTO_FILTER
替换INSO_FILTER
,其中已弃用。虽然已尽一切努力确保最大的向后兼容性之间两个筛选器,以便使用INSO_FILTER
应用程序将继续工作而无需修改,可能会出现一些差异。用户因此应该在他们新的程序中使用AUTO_FILTER
和在可能的情况下,替换实例的INSO_FILTER
,和任何优惠制度或常数,使在旧的应用程序中使用它。AUTO_FILTER
偏好具有下列属性:
属性 | 属性值 |
---|---|
超时 | 以秒为单位指定AUTO_FILTER 超时。使用 0 到 42,949,672 之间的数字。默认值是 120。设置此值 0 禁用的功能。
这等待期如何使用的方法取决于您如何设置 timeout_type。 此功能被禁用,相应的字符集和格式列导致 使用此功能来防止甲骨文文本索引从悬挂无限期地等待操作筛选器操作。 |
timeout_type | 指定的启发式算法或固定。默认值为启发式算法。
指定 Oracle 文本,以检查每个超时秒是否从外面在 HTML 导出输出增加了启发式算法。如果输出并没有增加,操作将终止该文档。在 指定固定终止外面在 HTML 出口加工后不论是西耶是否只挂过滤的超时秒数。当索引吞吐量比抽出时间来成功地筛选大型文档更重要时,此值是有用的。 |
output_formatting | 将此属性设置有对筛选器的性能或滤波器的输出没有影响。它被维护向后兼容性。 |
索引格式文件
若要包含格式化的文件,例如 Microsoft Word 文本栏编制索引,请使用AUTO_FILTER
。此筛选器将自动检测文档格式。您可以使用 CTXSYS
。AUTO_FILTER
的系统定义的偏好在参数子句中,如下所示:
create index hdocsx on hdocs(text) indextype is ctxsys.context parameters ('datastore ctxsys.file_datastore filter ctxsys.auto_filter');
显式地绕过纯文本或 HTML 混合的格式列中
混合格式列是包含多个文档的格式,如一列包含 Microsoft Word、 PDF、 纯文本和 HTML 文档的文本列。
AUTO_FILTER
可以索引列混合格式,自动绕过纯文本、 HTML 和 XML 文档。然而,如果您不想依赖于内置旁路机制,您可以显式您行标记为文本并导致AUTO_FILTER
来忽略行并且不处理任何方式中的文档。
基表中的格式列使您能够指定的文本列中所包含的文档的类型。您可以指定以下文件类型:TEXT
、BINARY
和IGNORE
。在索引,期间AUTO_FILTER
忽略键入的TEXT
,假定字符集列未指定任何文件。(带有TEXT
格式列类型的文档和一个与IGNORE
类型之间的区别是TEXT
文档编制索引,但而 IGNORE
文档根本未编制索引,该筛选器将忽略。使用IGNORE
忽略文件,例如图像文件或在一种语言,你不想要索引的文档。IGNORE
可以使用与任何筛选器类型。
若要设置AUTO_FILTER
旁路机制,必须在您的基表创建格式列。
举个例子:
create table hdocs ( id number primary key, fmt varchar2(10), text varchar2(80) );
你假设你索引大多是 Word 文档,指定BINARY
格式列筛选 Word 文档中。或者,为了AUTO_FILTER
忽略 HTML 文档,请在格式列中指定TEXT
。
例如,下面的语句将两个文档添加到文字的表格,将一种格式指派为BINARY
和其他TEXT
:
insert into hdocs values(1, 'binary', '/docs/myword.doc'); insert in hdocs values (2, 'text', '/docs/index.html'); commit;
若要创建索引,使用CREATE
INDEX
并在参数字符串中指定的格式列名称:
create index hdocsx on hdocs(text) indextype is ctxsys.context parameters ('datastore ctxsys.file_datastore filter ctxsys.auto_filter format column fmt');
如果您不指定TEXT
或BINARY
格式列,则使用BINARY
。
注:
您无需指定格式列CREATE
INDEX
时使用AUTO_FILTER
.字符集转换与 AUTO_FILTER
AUTO_FILTER
将文档转换为数据库字符集时文件格式列设置为TEXT
。在这种情况下, AUTO_FILTER
看字符集列来确定文档字符集。
如果字符集列的值不是甲骨文文字字符集名称,该文档被通过没有任何字符集转换。
注:
在使用AUTO_FILTER
时,您无需指定字符集列.如果你做指定的字符集列,不指定格式列AUTO_FILTER
作品喜欢CHARSET_FILTER,只是在这种情况下有没有日本字符集自动检测。
请参见:
"CHARSET_FILTER".NULL_FILTER
使用纯文本或 HTML 时要编制索引的NULL_FILTER
类型和没有筛选的需要来进行。NULL_FILTER
不具有属性。
HTML 文档编制索引
如果您的文档集完全是 HTML,Oracle 建议您在您的筛选器首选项中使用 NULL_FILTER
。
例如,要索引 HTML 文档集,可以如下指定为NULL_FILTER
和HTML_SECTION_GROUP
的系统定义的首选项:
create index myindex on docs(htmlfile) indextype is ctxsys.context parameters('filter ctxsys.null_filter section group ctxsys.html_section_group');
请参见:
节组的索引的 HTML 文档的详细信息,请参阅"一节组类型".MAIL_FILTER
使用MAIL_FILTER
来转换 RFC 822,RFC 2045 消息中对可转位刀片的文本。以下限制持有为输入:
-
文档必须是 US-ASCII
-
行不能超过 1024 个字节
-
文档必须是在 RFC 822 语法无效。
如果输入无效的行为是未定义的。由无错误过滤器,可能强劲处理存在一定的偏差。其他人可能会导致读取时间或过滤时间的错误。
MAIL_FILTER
具有下列属性:
属性 | 属性值 |
---|---|
INDEX_FIELDS | 指定以冒号分隔的要保留在输出中的字段列表。这些字段转换为标记的标记。例如,如果将INDEX_FIELDS 设置为"FROM":
成为:
只有顶级字段将转换以这种方式。 |
AUTO_FILTER_TIMEOUT | 指定 AUTO_FILTER 筛选通过邮件过滤器调用的超时值。默认值为 60。(替换INSO_TIMEOUT 属性和INSO_TIMEOUT 的向后兼容.) |
AUTO_FILTER_OUTPUT_FORMATTING | 指定或TRUE 或FALSE 。默认值是TRUE .
此属性将替换以前的 |
PART_FIELD_STYLE | 指定应如何转换发生在较低级别的部件和INDEX_FIELDS 特性所标识的字段。顶级的消息部分由INDEX_FIELDS 标识的字段总是转换为标记标记 (见INDEX_FIELDS 前面的说明) ;PART_FIELD_STYLE 控制后续部分 ; 转的型例如,附加的电子邮件。
可能的值包括 |
筛选器的行为
此筛选器执行以下操作为每个文档:
-
读取和删除页眉字段
-
解码的消息正文,如果需要,根据内容传输编码字段
-
采取行动取决于内容类型字段值和邮件筛选器配置文件中指定的用户指定的行为。(请参阅"关于邮件筛选器的配置文件")。可能采取的行动是:
-
生产输出文本 (
INCLUDE
) 体内。如果在包括部分在内容类型标头字段遇到没有字符集,则 Oracle 默认为您在特性中指定的值将列设置在基表中。你的名字你填充的字符设置的列在创建索引命令的参数字符串。 -
AUTO_FILTER
正文内容 (AUTO_FILTER
指令)。 -
从输出文本 (
IGNORE
删除正文内容)
-
-
如果未指定行为的配置文件中的类型,默认值如下:
-
文本 / *: 产生输出文本的身体
-
应用程序 / *:
AUTO_FILTER
正文内容 -
图像 / *、 音频 / *、 视频 / *、 模型 / *: 忽略
-
-
将分析多部分邮件,邮件过滤器应用以递归方式对每个部分。每个部分追加到输出。
-
所有文本制作将字符集转换为数据库字符集中,如果需要的话。
关于邮件筛选器配置文件
MAIL_FILTER
筛选器使用的邮件筛选器的配置文件,其中包含指令指定一个邮件文档的筛选方式。邮件筛选器的配置文件是一个可编辑的文本文件。在这里可以为每个内容类型来重写默认行为。配置文件还包含 IANA Oracle 全球化支持字符设置的名称映射。
文件的位置必须在ORACLE_HOME
/ctx/config。新的系统参数中存储要使用的文件的名称 MAIL_FILTER_CONFIG_FILE
。在安装,这是设置为 drmailfl.txt,具有有用的默认值的内容。
Oracle 建议您创建您自己的邮件筛选器配置文件以避免覆盖新的版本或修补程序集的安装。邮件筛选器配置文件应该在数据库字符集设置。
邮件文件的配置文件结构
该文件有两个部分,行为和数据。你指示开始的行为部分,如下所示:
[behavior]
每个线以下始于一个 mime 类型,然后空白,行为规范。MIME
类型可以是完整的TYPE
/SUBTYPE
或只是TYPE
,它将适用于该类型的所有子类型。TYPE
/SUBTYPE
规格覆盖TYPE
的规格,以重写默认行为。行为可以INCLUDE
, AUTO_FILTER
或IGNORE
(请参阅"筛选器的行为"的定义)。举个例子:
application/zip IGNORE application/msword AUTO_FILTER model IGNORE
您不能指定为"多部分"或"邮件"类型的行为。如果你这样做,这种行被忽略。一种类型的重复规范替换较早的规范。
评论可以列入的邮件配置文件的起始行以 # 符号。
字符集映射小节的开头
[charsets]
线包括 IANA 的名字,然后空格,然后一个 Oracle 全球化支持字符集的名称,比如:
US-ASCII US7ASCI ISO-8859-1 WE8ISO8859P1
此文件是邮件过滤器获取映射的唯一途径。没有默认值。
当您更改配置文件时,更改将影响仅索引后,点过的文档。您必须在更改该文件后刷新共享的池。
Mail_Filter 示例
假设我们有一个具有以下形式,其他带有不同主题行的电子邮件与我们的电子邮件相连的电子邮件:
To: somebody@someplace Subject: mainheader Content-Type: multipart/mixed . . . Content-Type: text/plain X-Ref: some_value Subject: subheader 1 . . . Content-Type: text/plain X-Control: blah blah blah Subject: subheader 2 . . .
我们设置INDEX_FIELDS
是"主体",最初, PART_FIELD_STYLE
到IGNORE
.
CTX_DDL.CREATE_PREFERENCE('my_mail_filt', 'mail_filter'); CTX_DDL_SET_ATTRIBUTE(my_mail_filt', 'INDEX_FILES', 'subject'); CTX_DDL.SET ATTRIBUTE ('my_mail_filt', 'PART_FIELD_STYLE', 'ignore');
现在时创建该索引,将会索引此文件,如下所示:
<SUBJECT>mainheader</SUBJECT>
如果PART_FIELD_STYLE
相反设置为TAG
,这成为:
<SUBJECT>mainheader</SUBJECT> <SUBJECT>subheader1</SUBJECT> <SUBJECT>subheader2</SUBJECT>
如果将PART_FIELD_STYLE
设置为FIELD
相反,这是的结果:
<SUBJECT>mainheader<SUBJECT> SUBJECT:subheader1 SUBJECT:subheader2
最后,如果PART_FIELD_STYLE
相反设置为TEXT
,然后结果是:
<SUBJECT>mainheader</SUBJECT> subheader1 subheader2
USER_FILTER
使用USER_FILTER
类型来指定外部筛选器用于筛选的列中的文档。USER_FILTER
具有以下属性:
- 命令
-
指定单一的可执行文件外部筛选器,用于筛选的列中存储的所有文本。如果不止一个文档格式存储在列中,为命令指定的外部筛选器必须认识和处理所有这种格式。
在 UNIX 上,您指定的可执行文件必须存在于
$ORACLE_HOME/ctx/bin
目录中。在 Windows 上,您指定的可执行文件中的%ORACLE_HOME%/bin
目录必须存在。您必须创建您的用户筛选器可执行文件具有两个参数: 第一个是要读取输入文件的名称和第二个是要写入的输出文件的名称。
如果所有文件格式都支持
AUTO_FILTER
,而不是USER_FILTER
使用AUTO_FILTER
,除非额外任务除了筛选所需的文件。
用户筛选器示例
下面的示例将用作用户筛选器的 Perl 脚本。此脚本将转换为大写的第一个参数中指定的输入的文字文件,并将输出写入到第二个参数中指定的位置:
#!/usr/local/bin/perl open(IN, $ARGV[0]); open(OUT, ">".$ARGV[1]); while (<IN>) { tr/a-z/A-Z/; print OUT; } close (IN); close (OUT);
假设这个文件命名为upcase.pl
,请创建筛选器首选项如下:
begin ctx_ddl.create_preference ( preference_name => 'USER_FILTER_PREF', object_name => 'USER_FILTER' ); ctx_ddl.set_attribute ('USER_FILTER_PREF','COMMAND','upcase.pl'); end;
在 SQL 中创建索引 * 加上,如下所示:
create index user_filter_idx on user_filter ( docs ) indextype is ctxsys.context parameters ('FILTER USER_FILTER_PREF');
PROCEDURE_FILTER
使用PROCEDURE_FILTER
类型来筛选您的文档的存储过程。每次一个文档需要进行筛选的时被调用存储的过程。
这种类型具有下列属性:
属性 | 目的 | 允许的值 |
---|---|---|
程序 | 筛选器名称的存储过程。 | 任何程序。该过程可以是 PL/SQL 存储过程。 |
input_type | 为存储过程的输入参数的类型。 | VARCHAR2, BLOB, CLOB, FILE |
先前 | 输出参数的存储过程的类型。 | VARCHAR2, CLOB, FILE |
rowid_parameter | 包括 rowid 参数吗? | TRUE/FALSE |
format_parameter | 包括格式参数吗? | TRUE/FALSE |
charset_parameter | 包括 charset 参数吗? | TRUE/FALSE |
- 程序
-
指定要用于筛选的存储过程的名称。该过程可以是 PL/SQL 存储过程。该过程可以是一个安全的标注或调用安全的标注。
与
rowid_parameter
、format_parameter
、charset_parameter
设置为 FALSE,该过程可以具有下列签名之一:PROCEDURE(IN BLOB, IN OUT NOCOPY CLOB) PROCEDURE(IN CLOB, IN OUT NOCOPY CLOB) PROCEDURE(IN VARCHAR, IN OUT NOCOPY CLOB) PROCEDURE(IN BLOB, IN OUT NOCOPY VARCHAR2) PROCEDURE(IN CLOB, IN OUT NOCOPY VARCHAR2) PROCEDURE(IN VARCHAR2, IN OUT NOCOPY VARCHAR2) PROCEDURE(IN BLOB, IN VARCHAR2) PROCEDURE(IN CLOB, IN VARCHAR2) PROCEDURE(IN VARCHAR2, IN VARCHAR2)
第一个参数是行的传递数据存储区未过滤的内容。第二个参数是要传递回筛选的文档文本的过程。
程序属性是强制性的并且没有默认值。
- input_type
-
指定的筛选过程的输入参数的类型。您可以指定以下内容之一:
类型 描述 程序 筛选器名称的存储过程。 input_type 为存储过程的输入参数的类型。 先前 输出参数的存储过程的类型。 rowid_parameter 包括 rowid 参数吗? Input_type 属性不是强制性的。如果未指定,BLOB 是默认值。
- 先前
-
指定的筛选过程的输出参数的类型。您可以指定下列类型之一:
类型 描述 CLOB
输出参数是 NOCOPY CLOB 中出来。你的程序必须写入 CLOB 中通过过滤后的内容。 VARCHAR2
输出参数是在出 NOCOPY VARCHAR2。你的程序必须写 VARCHAR2 变量的筛选的内容传递。 FILE
输出参数必须 IN
VARCHAR2
。在进入筛选过程,输出参数是一个临时文件的名称。筛选过程必须写入此命名的文件的已筛选的内容。只有当该过程是一个安全的标注,可以向文件中写入时,使用文件输出类型很有用。
先前属性不是强制性的。如果未指定,
CLOB
是默认的。 - rowid_ 参数
-
当指定 TRUE 时,作为第一个参数之前的输入和输出参数, 传递的 rowid 中要被筛选的文档。
例如,随着
INPUT_TYPE
BLOB
,OUTPUT_TYPE
CLOB
,和ROWID_PARAMETER
TRUE
,筛选过程必须具有签名,如下所示:procedure(in rowid, in blob, in out nocopy clob)
此属性是有用的当您的程序需要从其他列或表的数据。此属性不是强制性的。默认值为
FALSE
. - format_parameter
-
如果指定
TRUE
,被筛选的文档的格式列的值传递给筛选过程输入和输出参数,但后 rowid 参数,如果启用了。您指定的格式列的名称在参数字符串中的索引时使用的关键字
'format column <columnname>'
。该参数的类型必须是IN
VARCHAR2
.格式列的值可以读取根据 rowid 参数,但此属性使得单个筛选器的工作对多个表的结构,因为格式属性抽象,并不需要的知识的表格或格式的列的名称。
FORMAT_PARAMETER
不是强制性的。默认值为FALSE
. - charset_parameter
-
当你指定
TRUE
时,文档被过滤的字符集列的值传递给筛选过程输入和输出参数,但后的 rowid 和格式的参数,如果启用了。您指定的字符集列的名称在参数字符串中的索引时使用关键字
'charset column <columnname>'
。该参数的类型必须是IN
VARCHAR2
.CHARSET_PARAMETER
属性不是强制性的。默认值为 FALSE。
参数顺序
ROWID_PARAMETER
、 FORMAT_PARAMETER
、 CHARSET_PARAMETER
是完全独立的。该命令是 rowid,格式,然后字符集,但筛选过程传递只有所需的最小参数。
例如,假定INPUT_TYPE
是BLOB
, OUTPUT_TYPE
是CLOB
。如果您筛选过程需要所有的参数,必须为程序签名:
(id IN ROWID, format IN VARCHAR2, charset IN VARCHAR2, input IN BLOB, output IN OUT NOCOPY CLOB)
如果您的程序需要只有ROWID
,然后程序签名必须是:
(id IN ROWID,input IN BLOB, ouput IN OUT NOCOPY CLOB)
错误处理
筛选过程可以提高通过正常的 PL/SQL raise_application_error 设施所需的任何错误。这些错误传播到CTX_USER_INDEX_ERRORS视图或报告给用户,具体取决于如何调用筛选器。
程序筛选器首选项示例
考虑筛选过程CTXSYS.NORMALIZE
您定义具有下列签名:
PROCEDURE NORMALIZE(id IN ROWID, charset IN VARCHAR2, input IN CLOB, output IN OUT NOCOPY VARCHAR2);
若要使用此过程为您的筛选器,设置您的筛选器首选项,如下所示:
begin ctx_ddl.create_preference('myfilt', 'procedure_filter'); ctx_ddl.set_attribute('myfilt', 'procedure', 'normalize'); ctx_ddl.set_attribute('myfilt', 'input_type', 'clob'); ctx_ddl.set_attribute('myfilt', 'output_type', 'varchar2'); ctx_ddl.set_attribute('myfilt', 'rowid_parameter', 'TRUE'); ctx_ddl.set_attribute('myfilt', 'charset_parameter', 'TRUE'); end;
词法分析器类型
使用词法分析器首选项来指定要索引的文本的语言。若要创建词法分析器首选项,必须使用以下词法分析器类型之一:
类型 | 描述 |
---|---|
BASIC_LEXER | 从语言如英语和使用空白的大多数西方欧洲语言中的文本中提取令牌的 lexer 分隔单词。 |
MULTI_LEXER | 词法分析器的表包含不同语言的文档创建索引 |
CHINESE_VGRAM_LEXER | 从中文文本中提取令牌的词法分析器。 |
CHINESE_LEXER | 从中文文本中提取令牌的词法分析器。 |
JAPANESE_VGRAM_LEXER | 从日语文本中提取令牌的词法分析器。 |
JAPANESE_LEXER | 从日语文本中提取令牌的词法分析器。 |
KOREAN_MORPH_LEXER | 从朝鲜文文本中提取令牌的词法分析器。 |
USER_LEXER | 您创建的用于索引特定语言的词法分析器。 |
WORLD_LEXER | 词法分析器索引表中包含文件的不同的语言 ;在文档中的自动检测语言 |
BASIC_LEXER
使用BASIC_LEXER
类型来标识标记用于创建英语和所有其他支持空白分隔的语言的文本索引。
BASIC_LEXER
还允许基地字母转换、 复合词标引、 区分大小写的索引和空格分隔的语言具有扩展字符集的替换拼写。
以英文和法文,你可以使用BASIC_LEXER
来启用主题索引。
注:
在查询时查询术语也执行词法分析器并对标记索引 (例如,删除字符和基地字母转换) 之前的任何处理。这将确保查询条件相匹配的文本索引中的标记形式。BASIC_LEXER
具有下列属性:
属性 | 属性值 |
---|---|
延续 | 字符 |
numgroup | 字符 |
numjoin | 字符 |
printjoins | 字符 |
标点 | 字符 |
skipjoins | 字符 |
startjoins | 非字母数字字符,出现在标记的开头(字符串) |
endjoins | 非字母数字字符,出现在标记的结尾(字符串) |
空白 | 字符(字符串) |
换行符 | 换行符 (
)
CARRIAGE_RETURN ( ) |
base_letter | 没有 (已禁用) |
是的 (启用) | |
base_letter_type | 泛型 (默认值) |
特定 | |
override_base_letter | 真实
FALSE (默认值) |
mixed_case | 没有 (已禁用) |
是的 (启用) | |
复合材料 | 默认 (没有索引,默认设置的复合字) |
德语 (德国组合词索引) | |
荷兰语 (荷兰复合字索引) | |
index_stems | 0 无
1 英语 2 派生词缀 3 荷兰 4 法国 5 德国 6 意大利 7 西班牙 |
index_themes | 是的 (启用) |
没有 (禁用默认值) | |
没有 (禁用默认值) | |
index_text | YES (缺省启用, |
没有 (已禁用) | |
prove_themes | 是 (已启用,默认值) |
没有 (已禁用) | |
theme_language | 自动 (默认值) |
(任何全球化支持语言) | |
alternate_spelling | 德语 (德国替换拼写) |
丹麦语 (丹麦替换拼写) | |
瑞典语 (瑞典替换拼写) | |
没有没有替换拼写默认) | |
new_german_spelling | 是啊
无 (默认值) |
- 延续
-
S指定字符,指示词下一行上继续并应作为单个标记建立索引。最常见的符是连字符 '-' 和反斜杠 。
- numgroup
-
S指定单个字符指示,当它出现在字符串中的数字,这些数字为分组在一个大的单一单元内。
例如,逗号 ',' 可能定义为一个numgroup字符,因为它经常指示数以千计分组,当它出现在数字的字符串。
- numjoin
-
S指定的字符,当他们出现在字符串的位数,导致 Oracle 文本索引的数字字符串作为一个单一的单位或单词。
举个例子,期 '.' 可以定义为 numjoin 个字符,因为它常常充当小数点,当它出现在数字的字符串。
注:
Numjoin和numgroup的默认值是由为数据库指定的全球化支持初始化参数决定的。一般情况下,一个值,不需要指定为numjoin或numgroup ,创建
BASIC_LEXER
的 lexer 首选时. - printjoins
-
S指定的当它们出现在一个词 (开头、 中间或结束),任何地方都处理为字母数字和文本索引中的令牌中包含非字母数字字符。这包括printjoins ,连续发生。
例如,如果连字符-和下划线 '_' 字符被定义为printjoins、 _file_等伪知识分子的术语都存放在文本索引作为伪知识分子和_file_.
注:
如果printjoins字符也被定义为一个标点字符,该字符只处理作为一个字母数字字符如果紧跟着它的字符是一个标准的字母数字字符或已被定义为printjoins或skipjoins的字符。 - 标点
-
指定的非字母数字的字符,当它们出现在一个单词的结尾处显示一个句子的结束。默认值是期间 '。 ',问号 '吗? ',和感叹号'!'。
在文本编制索引之前,从令牌中删除被定义为标点的字符。然而,如果一个标点字符也被定义为一个printjoins字符,只有当它是在令牌中的最后一个字符时移除字符。
例如,如果句点 (.) 被定义为printjoins和标点字符,下列转换在进行索引和查询,以及过程中会发生:
令牌 索引的标记 .doc .doc dog.doc dog.doc 狗。doc 狗。doc 那只狗。 狗 狗...... 狗。 此外,
BASIC_LEXER
使用标点字符结合换行符和空格的字符,来确定句子的段落搜索的句子和段落分隔符。 - skipjoins
-
Specify 非字母数字字符,当它们出现在一个单词内标识 word 作为单个标记 ;然而,字符不会存储与文本索引中的令牌中。
例如,如果连字符 '-' 定义为skipjoins,词伪知识分子存储在pseudointellectual作为文本索引.
注:
printjoins和skipjoins是互斥的。不能为这两个属性指定相同的字符。 - startjoins/endjoins
-
Startjoins,为指定的字符,当遇到一个令牌中的第一个字符作为显式标识标记的开始。字符,以及立即遵循它,任何其他startjoins字符被列入该标记的文本索引项。此外,一个startjoins字符的字符串的第一个startjoins字符隐式结束前一个标记。
Endjoins,为指定的字符,当遇到一个令牌中的最后一个字符作为显式识别标记的结束。字符,以及立即遵循它,任何其他startjoins字符被列入该标记的文本索引项。
下列规则适用于startjoins和endjoins:
-
字符指定为startjoins/endjoins不能发生的任何其他属性为
BASIC_LEXER
. -
startjoins/endjoins字符可以出现只在开头或结尾标记
Printjoins 不同于 endjoins 和 startjoins,位置并不重要。例如, $35将索引作为一个标记如果 $是 startjoin 或 printjoin,而是作为两个标记如果它被定义为 endjoin。
- 空白
-
S指定被视为标记之间的空白区域的字符。
BASIC_LEXER
使用空白字符标点和换行字符结合来识别字符作为句子分隔符的句子和段落搜索的字符串。空白的预定义的默认值是 '空间' 和 '选项卡。不能更改这些值。指定字符为空格字符将添加到这些默认值。
- 换行符
-
S指定表示文本的行尾的字符。
BASIC_LEXER
使用换行符连同标点符号和空格字符识别作为句子和段落搜索段落分隔符的字符串。换行符的唯一有效值为
NEWLINE
和CARRIAGE_RETURN
(回车)。默认值是NEWLINE
. - base_letter
-
指定存储在文本索引中之前是否有音符 (元音变音、 变、 急性口音,等等) 的字符转换为其基窗体。默认值为没有 (基地字母转换禁用)。基地字母转换和
base_letter_type
的详细信息,请参阅基础字母转换. - base_letter_type
-
指定泛型或特定。
泛型的值是默认值,并信变换为基础的手段使用一个适用于所有语言的转换表。基地字母转换和
base_letter_type
的详细信息,请参阅基础字母转换. - override_base_letter
-
alternate_spelling
同时启用了base_letter
,则时,有时需要重写base_letter
,以防止意外的结果,从串行转换。请参见重写基信转换与替换拼写。默认值为FALSE
. - mixed_case
-
S指定词法分析器叶标记显示在文本中的完全相同的呢,还是将标记转换为全部大写。缺省设置为 NO (标记转换为全部大写)。
注:
Oracle 文本可以确保这个词与查询匹配的被查询的索引是否区分大小写。因此,如果您对您的文本索引启用区分大小写,针对索引的查询都区分大小写。 - 复合材料
-
指定是否复合词标引是禁用或启用或
GERMAN
或DUTCH
的文本。默认值是DEFAULT
(复合字索引禁用)。通常是在德国的字典中的一个条目的单词不将拆分为复合的茎,而不是字典条目的单词被拆分为复合茎。
要检索的索引的复合茎,必须发出一个干查询,例如$bahnhof。单词表词干分析器语言必须匹配的复合的茎的语言。
阻止用户词典
Oracle 文本附带产生用于ENGLISH
和DERIVATIONAL
所产生的字典 ($ORACLE_HOME/ctx/data/enlx/dren.dct
) 的系统。您可以创建您自己的语言,以自定义如何分解单词的用户词典。这些字典是表 2-16所示.
词典 | 语言 |
---|---|
$ORACLE_HOME/ctx/data/frlx/drfr.dct |
法语 |
$ORACLE_HOME/ctx/data/delx/drde.dct |
德语 |
$ORACLE_HOME/ctx/data/nllx/drnl.dct |
荷兰语 |
$ORACLE_HOME/ctx/data/itlx/drit.dct |
意大利语 |
$ORACLE_HOME/ctx/data/eslx/dres.dct |
西班牙语 |
词干的用户词典比那些表 2-16中列出的语言不受支持.
用户词典的格式如下所示:
input term <tab> output term
分解单词的个别部分必须用 # 字符分隔。以下的示例条目是为德语单词火车总站:
Hauptbahnhof<tab>Haupt#Bahnhof Hauptbahnhofes<tab>Haupt#Bahnhof Hauptbahnhof<tab>Haupt#Bahnhof Hauptbahnhoefe<tab>Haupt#Bahnhof
- index_themes
-
是指定索引主题信息用英文或法文。这使得
ABOUT
查询更精确。Index_themes和index_text的属性不可能都是号如果您使用
BASIC_LEXER
,并指定index_themes没有值,此属性默认为NO
.可以将此参数设置为 TRUE,任何为包括 CTXCAT 的索引类型。若要与 CATSEARCH 发出关于查询,请将查询模板使用上下文语法。
注:
index_themes
需要安装的知识库文章。知识库文章可能或不可能安装 Oracle 文本。在知识的基础上的详细信息,请参阅Oracle 文本应用程序开发人员指南. - prove_themes
-
指定
YES
以证明主题。主题证明试图在文档中查找相关的主题。当发现有没有相关的主题时,父主题被消除从文档。虽然主题证明是可以接受的大型文档,几句简短的文字说明很少证明父主题,从而导致贫穷召回性能与
ABOUT
查询。证明结果在较高的精度和减少 (减少返回的行) 召回
ABOUT
查询的主题。为较高的查全率ABOUT
查询中可能不是那么精确,您可以禁用主题证明。YES
.prove_themes
属性支持CONTEXT
和CTXRULE
的索引。 - theme_language
-
指定的知识库用于主题代当index_themes设置为
YES
。当index_themes是NO
的时将此参数设置有没有任何的影响。您可以指定任何全球化支持的语言或
AUTO
。您必须为您指定的语言的知识库文章。此版本提供一个知识库中只有英文和法文。在其他语言中,您可以创建您自己的知识库。默认值是
AUTO
,它指示系统重新设置此参数的语言环境。 - index_stems
-
指定的词干分析器用于干索引。你可以选择之一
-
没有一个
-
英语
-
派生词缀
-
荷兰语
-
法语
-
德语
-
意大利语
-
西班牙语
令牌被阻挡在索引时除了正常形式单一基窗体。索引茎允许更好的查询性能,对于干 ($) 的查询,如$computed.
- index_text
-
对索引词信息指定
YES
。Index_themes和index_text的属性都不能NO
.缺省设置为
NO
. - alternate_spelling
-
GERMAN
、DANISH
,或指定SWEDISH
,使不同的拼写这些语言之一。启用备用拼写使您能够查询中任何其他形式的单词。替换拼写默认是关闭的 ;然而,在 Oracle 提供
admin/defaults
(德语,drdefdk.sql
为丹麦语和瑞典语drdefs.sql
drdefd.sql
) 的特定于语言的脚本,替换拼写被打开的。如果安装过程中使用这些脚本,然后替换拼写是上。然而,您可以指定NONE
,没有备用的拼写。Oracle 的文本使用替换拼写公约有关详细信息,请参阅替换拼写. - new_german_spelling
-
指定是否使用
BASIC_LEXER
的查询返回两个传统和改革 (新) 拼写的德语单词。如果将new_german_spelling
设置为是,然后创建索引传统和新形式的单词。如果它设置为否,然后 word 将索引仅作为它在查询中的规定。默认值是号请参见:
"新的德语拼写"
BASIC_LEXER 示例
下面的示例设置 printjoin 字符和禁用索引与BASIC_LEXER
的主题:
begin ctx_ddl.create_preference('mylex', 'BASIC_LEXER'); ctx_ddl.set_attribute('mylex', 'printjoins', '_-'); ctx_ddl.set_attribute ( 'mylex', 'index_themes', 'NO'); ctx_ddl.set_attribute ( 'mylex', 'index_text', 'YES'); end;
若要创建索引,没有主题标引与 printjoins 字符设置所述,请发出以下语句:
create index myindex on mytable ( docs ) indextype is ctxsys.context parameters ( 'LEXER mylex' );
MULTI_LEXER
使用MULTI_LEXER
到索引文本列包含不同语言的文档。例如,可以使用此词法分析器将英语、 德语和日语文档存储的文本列进行索引。
Lexer 没有属性。
你基地的表中,必须有语言列。以多语言表的索引,您指定的语言列创建索引时。
创建多 lexer 偏好与CTX_DDL.CREATE_PREFERENCE
。你向多 lexer 偏好与CTX_DDL.ADD_SUB_LEXER
程序。
在索引、 MULTI_LEXER
检查每一行语言列的值和特定于语言的词法分析器来处理文档中的交换机。
WORLD_LEXER
词法分析器还执行多国语言的索引,但不需要单独的语言列 (也就是说,它有自动语言检测)。有关WORLD_LEXER
的详细信息,请参阅"WORLD_LEXER".
MULTI_LEXER 示例
创建多语言表语言列与主键、 文本列中,如下所示:
create table globaldoc ( doc_id number primary key, lang varchar2(3), text clob );
假设表保存大多是英文资料,与偶尔的德语或日语文档。若要处理这三种语言,您必须创建三子词法分析器、 一个用于英语、 德语和日语:
ctx_ddl.create_preference('english_lexer','basic_lexer'); ctx_ddl.set_attribute('english_lexer','index_themes','yes'); ctx_ddl.set_attribute('english_lexer','theme_language','english'); ctx_ddl.create_preference('german_lexer','basic_lexer'); ctx_ddl.set_attribute('german_lexer','composite','german'); ctx_ddl.set_attribute('german_lexer','mixed_case','yes'); ctx_ddl.set_attribute('german_lexer','alternate_spelling','german'); ctx_ddl.create_preference('japanese_lexer','japanese_vgram_lexer');
创建多 lexer 首选项:
ctx_ddl.create_preference('global_lexer', 'multi_lexer');
由于存储的文件大多是英语,使英语的词法分析器使用 CTX_DDL 的默认设置。ADD_SUB_LEXER:
ctx_ddl.add_sub_lexer('global_lexer','default','english_lexer');
现在,他们各自的语言与 CTX_DDL 中添加德语和日语的词法分析器。ADD_SUB_LEXER程序。此外假定语言列表示在标准的 ISO 639-2 的语言代码,所以添加那些作为替换值。
ctx_ddl.add_sub_lexer('global_lexer','german','german_lexer','ger'); ctx_ddl.add_sub_lexer('global_lexer','japanese','japanese_lexer','jpn');
现在,创建索引globalx
,指定多 lexer 偏好和语言列参数子句中,如下所示:
create index globalx on globaldoc(text) indextype is ctxsys.context parameters ('lexer global_lexer language column lang');
CHINESE_VGRAM_LEXER
CHINESE_VGRAM_LEXER
类型标识用于创建文本索引的中文文本中的标记。
CHINESE_LEXER
CHINESE_LEXER
类型标识繁体及简体的中文文本,用于创建 Oracle 文本索引中的标记。
此词法分析器提供了以下好处超过CHINESE_VGRAM_LEXER
:
-
生成较小的索引
-
更好的查询响应时间
-
生成真正的单词标记导致更好的查询精度
-
支持停止词
CHINESE_LEXER
使用不同的算法来生成标记,因为索引时间是长于与CHINESE_VGRAM_LEXER
.
如果你的数据库角色是由 Oracle 支持中文或 Unicode 字符集之一,您可以使用此词法分析器。
JAPANESE_VGRAM_LEXER
JAPANESE_VGRAM_LEXER
类型标识在日语中的令牌创建文本索引。它不具有属性。此词法分析器支持干 ($) 运算符。
JAPANESE_LEXER
JAPANESE_LEXER
类型标识在日语中的令牌创建文本索引。此词法分析器支持干 ($) 运算符。
此词法分析器提供了以下好处超过JAPANESE_VGRAM_LEXER
:
-
生成较小的索引
-
更好的查询响应时间
-
生成真正的单词标记导致更好的查询精度
因为JAPANESE_LEXER
使用一种新的算法来生成令牌,索引时间是长于与JAPANESE_VGRAM_LEXER
.
日本的词法分析器的示例
JAPANESE_LEXER
指定用于创建文本索引时, JAPANESE_LEXER
将其一个句子解析成单词。
例如,以下复词 (自然语言研究所)
图 nihongo1.gif 的描述
被索引作为三个标记:
图 nihongo2.gif 的描述
为了解决一个句子成单词,引用的内部字典。当不能在内部字典中找到单词时,Oracle 文本将使用JAPANESE_VGRAM_LEXER
来解决它。
KOREAN_MORPH_LEXER
KOREAN_MORPH_LEXER
类型标识中用于创建 Oracle 文本索引的朝鲜语文字的标记。
提供的字典
KOREAN_MORPH_LEXER
使用四个字典:
词典 | 文件 |
---|---|
系统 | $ORACLE_HOME/ctx/data/kolx/drk2sdic.dat |
语法 | $ORACLE_HOME/ctx/data/kolx/drk2gram.dat |
Stopword | $ORACLE_HOME/ctx/data/kolx/drk2xdic.dat |
用户定义 | $ORACLE_HOME/ctx/data/kolx/drk2udic.dat |
使用的 KSC 5601 或 MSWIN949 的字符集应该编写语法,用户定义的和 stopword 字典。您可以修改这些词典使用已定义的规则。不能修改系统词典。
可以将未注册的单词添加到用户定义的词典文件。用于指定新单词的规则是在文件中。
Unicode 支持
KOREAN_MORPH_LEXER
支持:
-
在 Unicode 中定义的非 KSC5601 韩文字符的单词
-
补充字符
请参见:
对补充字符的信息,请参阅Oracle 数据库全球化支持指南韩国的一些文件可能有非 KSC5601 个字符。KOREAN_MORPH_LEXER
可以认识到所有可能的 11,172 韩国 (朝鲜) 字符,此类文件还使用 UTF8 或 AL32UTF8 字符集解释。
使用您的数据库的 AL32UTF8 字符集来提取代理项字符。默认情况下, KOREAN_MORPH_LEXER
提取所有系列的代理项字符在文档中为每个数据系列的一个标记。
KOREAN_MORPH_LEXER 属性
当您使用KOREAN_MORPH_LEXER
时,您可以指定以下属性:
KOREAN_MORPH_LEXER 示例: 将复合属性设置
你可以使用复合属性来控制如何复合名词被编入索引。
NGRAM 示例
当您指定NGRAM
复合属性时,复合名词索引与所有可能的组件标记。例如,以下复合名词 (信息处理研究所)
图 1.jpg 的描述
被索引作为六个标记:
图 2.jpg 的描述
图 3.jpg 的描述
您可以指定NGRAM
索引,如下所示:
begin ctx_ddl.create_preference('my_lexer','KOREAN_MORPH_LEXER'); ctx_ddl.set_attribute('my_lexer','COMPOSITE','NGRAM'); end
若要创建索引:
create index koreanx on korean(text) indextype is ctxsys.context parameters ('lexer my_lexer');
COMPONENT_WORD 示例
当你为复合属性指定了COMPONENT_WORD
时,复合名词和其组件编制索引。例如,以下复合名词 (信息处理研究所)
图 1.jpg 的描述
作为四个令牌被索引:
图 1.jpg 的描述
图 comp.jpg 的描述
您可以指定COMPONENT_WORD
索引,如下所示:
begin ctx_ddl.create_preference('my_lexer','KOREAN_MORPH_LEXER'); ctx_ddl.set_attribute('my_lexer','COMPOSITE','COMPONENT_WORD'); end
若要创建索引:
create index koreanx on korean(text) indextype is ctxsys.context parameters ('lexer my_lexer');
USER_LEXER
使用 USER_LEXER 可以插上您自己的特定于语言的词法分析解决方案。这使您可以定义为不支持 Oracle 文本的语言的词法分析器。它还使您可以定义新的词法分析器的一种语言,支持,但其词法分析器不适合您的应用程序。
您注册与 Oracle 文本的用户定义词法分析器是由两个例程,您必须提供:
用户定义的例程 | 描述 |
---|---|
索引过程 | 存储的过程 (PL/SQL) 实现的文档和停止词标记化。输出必须是 XML 文档作为指定在这一节。 |
查询过程 | 存储的过程 (PL/SQL) 实现的查询词标记化。输出必须是 XML 文档作为指定在这一节。 |
INPUT_TYPE
两个不同的接口支持的用户定义的词法分析器索引过程。一个接口使文档或停止词和编码为 XML 作为 VARCHAR2 数据类型传递,而其他接口使用 CLOB 数据类型对应的标记。此属性指示由 INDEX_PROCEDURE 属性所指定的存储过程实现的接口。
VARCHAR2 接口
BASIC_WORDLIST 属性表 2-25描述的接口,使文档或停止从非索引字表对象要被分词 word 将作为 VARCHAR2 者从 Oracle 文本到该存储过程,这些令牌作为传递 VARCHAR2 以及从存储过程追溯到 Oracle 文本传递。
您用户定义的 lexer 索引程序应使用此接口,当要创建索引的列中的所有文档都是小于或等于 32512 字节和令牌可以由小于或等于 32512 字节。在这种情况下也可以使用 CLOB 接口给出了在表 2-26 ,虽然 VARCHAR2 接口通常会比 CLOB 接口更快地执行。
这一程序必须定义以下参数:
表 2-25 VARCHAR2 接口的 INDEX_PROCEDURES
参数位置 | 参数模式 | 参数数据类型 | 描述 |
---|---|---|---|
1 | 在 | VARCHAR2 | 文档或停止词从要被分词的非索引字表对象。
如果文档是大于 32512 字节然后 Oracle 文本会汇报分度误差的文档级别。 |
2 | 在出 | VARCHAR2 | 作为 XML 编码的标记。
如果文档包含没有标记,则必须返回 NULL 或返回的 XML 文档中的标记元素必须包含任何子元素。 数据的字节长度必须小于或等于 32512。 若要提高性能,请使用 NOCOPY 提示,声明此参数时。这传递数据的引用,而不是将数据传递的价值。 此过程返回的 XML 文档不应该包含多余的空格字符 (通常用来提高可读性)。这将减少反过来减少传输时间该 XML 文档的大小。 为了提高性能,index_procedure 不应验证与运行时相应的 XML 架构的 XML 文档。 请注意此参数是在出性能的目的。存储的过程具有不需要使用的值。 |
3 | 在 | 布尔值 | Oracle 文本将此参数设置为 TRUE,当 Oracle 文本所需的字符偏移量和认定被标记的文档中标记的字符长度。
Oracle 文本将此参数设置为 FALSE,当文本不感兴趣的字符偏移量和认定被标记的文档中标记的字符长度。这意味着不过,关闭 XML 属性和 len 不使用。 |
CLOB 接口
表 2-26描述 CLOB 界面,使文档或停止从非索引字表对象,将标记词作为 CLOB 者从 Oracle 文本到该存储过程,这些令牌作为传递 CLOB,以及从存储过程追溯到 Oracle 文本传递。
索引过程的用户定义词法分析器应使用此接口,当至少一个要被索引的列中的文档是大于 32512 字节或由超过 32512 个字节表示对应的标记。
表 2-26 CLOB 接口为 INDEX_PROCEDURE 的
参数位置 | 参数模式 | 参数数据类型 | 描述 |
---|---|---|---|
1 | 在 | CLOB | 文档或停止词从要被分词的非索引字表对象。 |
2 | 在出 | CLOB | 作为 XML 编码的标记。 |
3 | 在 | 布尔值 | 如果文档包含没有标记,则必须返回 NULL 或返回的 XML 文档中的标记元素必须包含任何子元素。
若要提高性能,请使用 NOCOPY 提示,声明此参数时。这传递数据的引用,而不是将数据传递的价值。 此过程返回的 XML 文档不应该包含多余的空格字符 (通常用来提高可读性)。这将减少反过来减少传输时间该 XML 文档的大小。 为了提高性能,index_procedure 不应验证与运行时相应的 XML 架构的 XML 文档。 请注意此参数是在出性能的目的。存储的过程具有不需要使用的值。值将始终为截断的 CLOB。 |
第一和第二个参数是临时 CLOB。避免将这些 CLOB 定位器分配给其他定位器变量。将形参 CLOB 定位器分配给另一个定位器变量会导致临时的 CLOB 要创建导致性能命中一个新副本。
QUERY_PROCEDURE
此回调存储过程是 Oracle 文本称为标记词s 在查询中的所需。以空格分隔的一组字符 (不包括的查询运算符) 在查询中将标识 Oracle 文本作为一个词.
限制
此过程必须不执行任何以下操作:
-
回滚
-
显式或隐式提交当前事务
-
发出任何其它事务控制语句
-
更改会话语言或领土
返回的 XML 文档的根元素标记的子元素必须是相同的顺序标记出现在查询词被标记中。
此存储过程的行为必须是确定对所有参数。
参数
表 2-27描述了用户定义的词法分析器查询程序的界面:
参数位置 | 参数模式 | 参数数据类型 | 描述 |
---|---|---|---|
1 | 在 | VARCHAR2 | 查询词被分词。 |
2 | 在 | CTX_ULEXER_WILDCARD_TAB | 通配符字符 (%和 _) 查询字中的字符偏移量。如果查询词通过 Oracle 文本中不包含任何通配符字符然后此索引的表将为空。
通配符查询词中的必须保留在通配符查询功能才能正常工作的顺序返回的标记。 字符偏移量为 0 (零) 的基础。偏移的信息遵循 USC 2 代码点语义。 |
3 | 在出 | VARCHAR2 | 作为 XML 编码的标记。
如果查询词包含没有标记然后必须返回 NULL 或返回的 XML 文档中的标记元素必须包含任何子元素。 数据的长度必须小于-等于 32512 字节为单位)。 |
作为 XML 编码的标记
由存储过程返回的标记的顺序必须表示为 XML 1.0 文档。XML 文档必须是有效给出了在以下各节中的 XML 架构。
限制
为了提升性能的此功能,XML 解析器在 Oracle 文本将不会执行验证和将不是一个全功能的 XML 兼容解析器。这意味着将支持只有很少的 XML 功能。不支持以下 XML 功能:
-
文档类型声明 (例如,
<!DOCTYPE [...]>
),因此实体声明。只有下列内置实体可以引用: lt,gt,amp 及 apos。 -
CDATA 节。
-
评论。
-
处理指令。
-
XML 声明 (例如,
<?xml version="1.0" ...?>
). -
命名空间。
-
使用的元素和属性,而不是由相应的 XML 架构定义。
-
字符引用 (用于示例 & #x099F;)。
-
xml: space 属性。
-
xml: lang 属性
没有位置、 用户定义的索引程序的 XML 架构
本节介绍了额外的约束条件的用户定义的词法分析器索引过程,当第三个参数为 FALSE 返回的 XML 文档。返回的 XML 文档必须是有效下面的 XML 架构:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="tokens"> <xsd:complexType> <xsd:sequence> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="eos" type="EmptyTokenType"/> <xsd:element name="eop" type="EmptyTokenType"/> <xsd:element name="num" type="xsd:token"/> <xsd:group ref="IndexCompositeGroup"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- Enforce constraint that compMem element must be preceeded by word element or compMem element for indexing --> <xsd:group name="IndexCompositeGroup"> <xsd:sequence> <xsd:element name="word" type="xsd:token"/> <xsd:element name="compMem" type="xsd:token" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:group> <!-- EmptyTokenType defines an empty element without attributes --> <xsd:complexType name="EmptyTokenType"/> </xsd:schema>
这里是一些此 XML 架构的限制:
-
根元素是令牌。这是强制性的。它不具有属性。
-
根元素可以有零个或更多子元素。子元素可以是以下之一: eos、 eop、 num,单词和 compMem。其中每一个表示特定类型的令牌。
-
CompMem 元素的前面必须由 word 元素或 compMem 元素。
-
Eos 和 eop 元素没有属性,并且必须是空的元素。
-
Num,单词和 compMem 的元素有没有属性。Oracle 文本将正常化这些元素的内容,如下所示: 空格字符转换成空格字符、 折叠到单个空格字符的相邻的空格字符、 移除前导空格和尾随空格,执行实体引用替换和截断为 64 个字节。
表 2-28描述前面的 XML 架构中定义的元素名称。
表 2-28 用户定义词法分析器索引程序的 XML 架构元素名称
元素 | 描述 |
---|---|
词 | 此元素表示一个简单的单词标记。元素的内容是这个词本身。Oracle 文本并识别此令牌被停用词或非停用词以及适当地处理它的工作。 |
全国矿工工会 | 此元素表示一个算法的数字标记。元素的内容是算术数字本身。Oracle 文本视为停用词的此令牌,如果非索引字表偏好已作为 stopclass 添加的数字。否则此令牌被视为单词标记相同的方式。
支持这种令牌类型是可选的。没有为此令牌类型的支持,添加 NUMERBS stopclass 将有没有影响。 |
eos | 此元素表示句子结束标记。Oracle 文本使用此信息,以便它可以支持内句子查询。
支持这种令牌类型是可选的。没有为此令牌类型的支持,针对一句节的查询将不按预期工作。 |
eop | 此元素表示段落结束标记。Oracle 文本使用此信息,以便它可以支持内段的查询。
支持这种令牌类型是可选的。没有为此令牌类型的支持,对段节的查询将不按预期工作。 |
compMem | 相同的 word 元素,只是隐式的词偏移量前一个单词标记相同。
此令牌类型的支持是可选的。 |
示例
文档: Vom Nordhauptbahnhof 和 aus der Innenstadt zum Messegelände。
令牌:
<tokens> <word> VOM </word> <word> NORDHAUPTBAHNHOF </word> <compMem>NORD</compMem> <compMem>HAUPT </compMem> <compMem>BAHNHOF </compMem> <compMem>HAUPTBAHNHOF </compMem> <word> UND </word> <word> AUS </word> <word> DER </word> <word> INNENSTADT </word> <word> ZUM </word> <word> MESSEGELÄNDE </word> <eos/> </tokens>
用户定义的索引过程与位置的 XML 架构
本节介绍了额外的限制强加给由用户定义的词法分析器索引过程,第三个参数为 TRUE 时返回的 XML 文档。返回的 XML 文档必须符合下面的 XML 架构的有效:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="tokens"> <xsd:complexType> <xsd:sequence> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="eos" type="EmptyTokenType"/> <xsd:element name="eop" type="EmptyTokenType"/> <xsd:element name="num" type="DocServiceTokenType"/> <xsd:group ref="DocServiceCompositeGroup"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- Enforce constraint that compMem element must be preceeded by word element or compMem element for document service --> <xsd:group name="DocServiceCompositeGroup"> <xsd:sequence> <xsd:element name="word" type="DocServiceTokenType"/> <xsd:element name="compMem" type="DocServiceTokenType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:group> <!-- EmptyTokenType defines an empty element without attributes --> <xsd:complexType name="EmptyTokenType"/> <!-- DocServiceTokenType defines an element with content and mandatory attributes --> <xsd:complexType name="DocServiceTokenType"> <xsd:simpleContent> <xsd:extension base="xsd:token"> <xsd:attribute name="off" type="OffsetType" use="required"/> <xsd:attribute name="len" type="xsd:unsignedShort" use="required"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType name="OffsetType"> <xsd:restriction base="xsd:unsignedInt"> <xsd:maxInclusive value="2147483647"/> </xsd:restriction> </xsd:simpleType> </xsd:schema>
一些此 XML 架构的限制如下:
-
根元素是令牌。这是强制性的。它不具有属性。
-
根元素可以有零个或更多子元素。子元素可以是以下之一: eos、 eop、 num,单词和 compMem。其中每一个表示特定类型的令牌。
-
CompMem 元素的前面必须由 word 元素或 compMem 元素。
-
Eos 和 eop 元素没有属性,并且必须是空的元素。
-
Num,单词和 compMem 的元素有两个强制性属性:
off
和长度。Oracle 文本将正常化这些元素的内容,如下所示: 空格字符转换成空格字符、 折叠到单个空格字符的相邻的空格字符、 移除前导空格和尾随空格,执行实体引用替换和截断为 64 个字节。 -
off
属性值必须是介于 0 到 2147483647 包容性之间的整数。 -
len
属性值必须是整数 0 和 65535 之间的包容性。
表 2-28描述前面的 XML 架构中定义的元素类型。
表 2-29描述前面的 XML 架构中定义的属性。
属性 | 描述 |
---|---|
关闭 | 此属性表示的字符偏移量的标记出现在被标记的文档。
偏移量是字符文档传递给用户定义的词法分析器索引过程,不是由数据存储区读取的文档。获取数据存储区的文件可能由筛选器对象或节组的对象,或两者之前被传递给用户定义的词法分析器索引过程, 预先处理。 正在标记文档中的第一个字符的偏移量为 0 (零)。偏移的信息遵循 USC 2 代码点语义。 |
莱恩 | 此属性表示该标记的字符长度 (SQL 函数长度相同的语义) 出现在被标记的文档。
长度是传递给用户定义的词法分析器索引过程,不是文档数据存储区读取的字符文件。在被传递给用户定义的词法分析器索引过程前可能通过筛选器对象或节组对象预先处理文档获取数据存储区。 长度信息遵循 USC 2 代码点语义。 |
off
属性值和len
属性值的总和必须小于或等于被标记文档中的字符总数。这是为了确保文件偏移量和被引用的字符在文档边界内。
用户定义的词法分析器查询程序的 XML 架构
本节介绍了额外的限制强加给用户定义的词法分析器查询过程所返回的 XML 文档。返回的 XML 文档必须是有效下面的 XML 架构:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="tokens"> <xsd:complexType> <xsd:sequence> <xsd:choice minOccurs="0" maxOccurs="unbounded"> <xsd:element name="num" type="QueryTokenType"/> <xsd:group ref="QueryCompositeGroup"/> </xsd:choice> </xsd:sequence> </xsd:complexType> </xsd:element> <!-- Enforce constraint that compMem element must be preceeded by word element or compMem element for query --> <xsd:group name="QueryCompositeGroup"> <xsd:sequence> <xsd:element name="word" type="QueryTokenType"/> <xsd:element name="compMem" type="QueryTokenType" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:group> <!-- QueryTokenType defines an element with content and with an optional attribute --> <xsd:complexType name="QueryTokenType"> <xsd:simpleContent> <xsd:extension base="xsd:token"> <xsd:attribute name="wildcard" type="WildcardType" use="optional"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> <xsd:simpleType name="WildcardType"> <xsd:restriction base="WildcardBaseType"> <xsd:minLength value="1"/> <xsd:maxLength value="64"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="WildcardBaseType"> <xsd:list> <xsd:simpleType> <xsd:restriction base="xsd:unsignedShort"> <xsd:maxInclusive value="378"/> </xsd:restriction> </xsd:simpleType> </xsd:list> </xsd:simpleType> </xsd:schema>
这里是一些此 XML 架构的限制:
-
root
元素是令牌。这是强制性的。它不具有属性。 -
root
元素可以有零个或更多子元素。子元素可以是以下之一:num
和word
。其中每一个表示特定类型的令牌。 -
compMem
元素的前面必须由word
元素或compMem
元素。compMem
的目的是,使USER_LEXER
查询返回多个窗体为单个查询。例如,如果用户定义的词法分析器索引词银行为BANK(FINANCIAL)
和BANK(RIVER)
,查询过程可以返回作为一个word
和一个compMem
元素作为第二第一学期:<tokens> <word>BANK(RIVER)</word> <compMem>BANK(FINANCIAL)</compMem> </tokens>
请参阅表 2-30,更多关于
compMem
元的"用户定义词法分析器查询程序 XML 架构属性" 。 -
Num 和 word 元素有一个单一的可选属性: 通配符。Oracle 文本将正常化这些元素的内容,如下所示: 空格字符转换成空格字符、 折叠到单个空格字符的相邻的空格字符、 移除前导空格和尾随空格,执行实体引用替换和截断为 64 个字节。
-
通配符属性值是白色空间分隔的整数列表。整数的最小数目是 1,整数的最大数目是 64。整数值必须介于 0 和 378 包容性。Intriguers 在列表中的可以按任何顺序。
表 2-28描述前面的 XML 架构中定义的元素类型。
表 2-30介绍了前面的 XML 架构中定义的属性。
属性 | 描述 |
---|---|
compMem | 相同的word 元素,但其隐式词偏移量是以前的word 标记一样。Oracle 文本将等同于此令牌与前面的 word 标记和随后compMem 令牌使用查询EQUIV 运算符。 |
通配符 | 任何 %或 _ 的字符在查询中,都没有逃过由用户被视为通配符字符,因为它们会被其他字符代替。这些查询中的通配符字符必须为通配符查询功能才能正常工作秩序的标记化期间保留。此属性所表示元素的内容中的通配符字符的字符偏移的量 (SQL 函数长度相同的语义)。Oracle 文本将调整这些元素的内容进行任何正常化的偏移量。偏移量所指向的字符必须要么是 %或 _ 字符。
在元素的内容中的第一个字符的偏移量为 0。偏移的信息遵循 USC 2 代码点语义。 如果令牌中不包含任何通配符字符必须不指定此属性。 |
WORLD_LEXER
使用WORLD_LEXER
对包含不同语言的文档的索引文本列。例如,可以使用此词法分析器将英语、 日语和德语文档存储的文本列进行索引。
WORLD_LEXER
不同于MULTI_LEXER
, WORLD_LEXER
将自动检测文档的语言。不像MULTI_LEXER
, WORLD_LEXER
不需要您有一个语言列在基础表中或指定的语言列,当您创建索引时。此外,它是不必要使用 sub-词法分析器与MULTI_LEXER
一样。(请参见MULTI_LEXER.)
Lexer 没有属性。
WORLD_LEXER
工程与语言的字符集的 Unicode 4.0 标准所定义。WORLD_LEXER
可以使用的语言的列表,请参阅"世界词法分析器功能".
单词表 类型
使用的单词表首选项以启用查询选项例如词干分析,模糊匹配为您的语言。您还可以使用单词表偏好来启用子字符串和前缀索引,从而提高了通配符查询CONTAINS
与CATSEARCH
的性能.
若要创建单词表首选项,必须使用BASIC_WORDLIST
,这是唯一可用的类型。
BASIC_WORDLIST
使用BASIC_WORDLIST
类型来启用词干和模糊匹配或者创建前缀索引,与文本索引。
请参见:
有关干和模糊算子的详细信息,请参阅第 3 章,"Oracle 文本包含查询运算符".BASIC_WORDLIST
具有下列属性:
- 词干分析器
-
指定用于在文本查询中的单词词干的词干分析器。当您不指定一个值为词干分析器时,默认为
ENGLISH
.指定
AUTO
系统来自动设置的词干的语言,根据会话的语言设置。没有语言的词干分析器时,默认值为NULL
。与NULL
的词干分析器,干操作员在查询中将被忽略。您可以创建您自己词干的用户词典。更多的信息,请参阅"阻止用户词典" 。
- fuzzy_match
-
S指定哪些模糊匹配例程用于列。模糊匹配目前支持英语,日语,以及在较小的程度上,西方的欧洲语言。
注:
汉语和韩语的fuzzy_match属性值是防止的英语和日语的模糊匹配例程使用在中文和朝鲜文的虚拟属性值。Fuzzy_match的默认值是
GENERIC
.指定
AUTO
系统来自动设置模糊匹配的语言根据会话的语言设置。
- fuzzy_score
-
指定默认下限的模糊评分。请指定一个介于 0 和 80。分数低于这个数字的文本不会返回。默认值为 60。
模糊积分是衡量查询词扩展的词是多么接近。分数越高越好这场比赛。使用此参数来限制模糊扩产到最好的比赛。
- fuzzy_numresults
-
指定模糊扩产的最大数目。使用 0 到 5000 之间的数字。默认值为 100。
设置模糊的扩张限制扩展到指定数目的最匹配的单词。
- substring_index
-
指定
TRUE
为 Oracle 文本来创建一个子字符串的索引。子字符串索引可以提高性能为左截断或双截断通配符查询 (如%ing ) 或%奔驰 %。默认值为 false。子字符串索引索引和磁盘资源具有下列影响:
-
创建索引和 DML 处理是慢达 4 倍
-
创建的子字符串索引的大小是大约 $X 指数对 word 表格的大小。
-
与
substring_index
启用索引创建需要更多的回滚段比与子字符串索引的索引刷新期间关闭。Oracle 建议您下列操作之一时创建的子字符串的索引:-
使可用双平常的回滚或
-
减少索引内存来减小索引刷新到磁盘
-
- prefix_index
-
指定
yes
以启用前缀索引。前缀索引可以提高性能为右截断的通配符搜索如收件人 %。默认值为NO
.注:
启用前缀索引增加索引的大小。到多个前缀,在 $I 表中存储的前缀索引排骨了令牌。例如,单词
TOKEN
和TOY
通常是编入索引,这样 $I 表中:令牌 类型 信息 令牌 0 POS DOCID 1 1 玩具 0 POS DOCID 1 3 带有前缀索引,Oracle 文本索引这些标记,如下所示的 6 新令牌类型的子字符串前缀:
令牌 类型 信息 令牌 0 POS DOCID 1 1 玩具 0 POS DOCID 1 3 T 6 DOCID 1 1 POS 收款机 3 自 6 DOCID 1 1 POS 收款机 3 托克 6 POS DOCID 1 1 以 6 POS DOCID 1 1 令牌 6 POS DOCID 1 1 玩具 6 POS DOCID 1 3 通配符搜索
TO%
现在都快,因为 Oracle 文本并没有扩展条款和合并的结果集。若要获取结果,Oracle 文本只需要阅读一下 (TO,6) 行。 - prefix_length_min
-
指定索引的前缀的最小长度。默认值为 1。
例如,设置
prefix_length_min
3 和prefix_length_max
对 5 项指标为 3 到 5 个字符长之间的所有前缀。注:
使用慢的方法的等价性扩张和合并搜索通配符搜索其模式是最小长度下方或上方的最大长度。 - prefix_length_max
-
指定索引的前缀的最大长度。默认值为 64。
例如,设置
prefix_length_min
3 和prefix_length_max
对 5 项指标为 3 到 5 个字符长之间的所有前缀。注:
使用慢的方法的等价性扩张和合并搜索通配符搜索其模式是最小长度下方或上方的最大长度。 - wildcard_maxterms
-
在通配符 (%) 扩展中指定条件的最大数目。使用此参数可以保持在可接受的限度内的通配符查询性能。Oracle 文本返回一个错误,当通配符查询扩展超过这个数字。
BASIC_WORDLIST 示例
下面的示例演示使用BASIC_WORDLIST
类型。
使模糊匹配和词干
以下示例启用词干和模糊匹配为英语。STEM_FUZZY_PREF
的偏好将扩产的数目设置为允许的最大。此首选项也指示系统创建的子字符串的索引,以提高双截断搜索的性能。
begin ctx_ddl.create_preference('STEM_FUZZY_PREF', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','FUZZY_MATCH','ENGLISH'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','FUZZY_SCORE','0'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','FUZZY_NUMRESULTS','5000'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','SUBSTRING_INDEX','TRUE'); ctx_ddl.set_attribute('STEM_FUZZY_PREF','STEMMER','ENGLISH'); end;
若要在 SQL 中创建索引,请发出以下语句:
create index fuzzy_stem_subst_idx on mytable ( docs ) indextype is ctxsys.context parameters ('Wordlist STEM_FUZZY_PREF');
使字符串的子字符串和前缀索引
下面的示例设置词库首选前缀和字符串的子字符串的索引。为前缀索引,它指定标记前缀 3 到 4 个字符长之间创建 Oracle 的文本:
begin
ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE'); ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH',3); ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', 4); ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES');
end
设置通配符扩展限制
使用 wildcard_maxterms 属性来设置最大允许条件中的通配符扩展。
--- create a sample table drop table quick ; create table quick ( quick_id number primary key, text varchar(80) ); --- insert a row with 10 expansions for 'tire%' insert into quick ( quick_id, text ) values ( 1, 'tire tirea tireb tirec tired tiree tiref tireg tireh tirei tirej'); commit; --- create an index using wildcard_maxterms=100 begin Ctx_Ddl.Create_Preference('wildcard_pref', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('wildcard_pref', 'wildcard_maxterms', 100) ; end; / create index wildcard_idx on quick(text) indextype is ctxsys.context parameters ('Wordlist wildcard_pref') ; --- query on 'tire%' - should work fine select quick_id from quick where contains ( text, 'tire%' ) > 0; --- now re-create the index with wildcard_maxterms=5 drop index wildcard_idx ; begin Ctx_Ddl.Drop_Preference('wildcard_pref'); Ctx_Ddl.Create_Preference('wildcard_pref', 'BASIC_WORDLIST'); ctx_ddl.set_attribute('wildcard_pref', 'wildcard_maxterms', 5) ; end; / create index wildcard_idx on quick(text) indextype is ctxsys.context parameters ('Wordlist wildcard_pref') ; --- query on 'tire%' gives "wildcard query expansion resulted in too many terms" select quick_id from quick where contains ( text, 'tire%' ) > 0;
存储类型
使用存储首选项来指定与文本索引关联的表的表空间和创建参数。该系统提供了一个称为BASIC_STORAGE
的单个存储类型:
BASIC_STORAGE
BASIC_STORAGE
类型指定数据库表和构成文本索引的索引的表空间和创建参数。
您指定的子句添加到索引创建在内部CREATE
TABLE
(CREATE
INDEX
为i_index _clause) 的语句。您可以指定最允许的条款,例如存储、 LOB 存储或分区。但是,您不能指定索引组织的表子句。
请参见:
有关如何指定CREATE
TABLE
和CREATE
INDEX
的语句的详细信息,请参阅Oracle 数据库 SQL 引用。BASIC_STORAGE
具有下列属性:
存储默认行为
默认情况下,不设置BASIC_STORAGE
属性。在这种情况下,在索引所有者默认表空间中创建文本索引表。请考虑以下声明用户IUSER
,没有BASIC_STORAGE
属性设置:
create index IOWNER.idx on TOWNER.tab(b) indextype is ctxsys.context;
在此示例中,在IOWNER's
默认表空间中创建文本索引。
存储示例
下面的示例指定索引表是在 1k 初始范围 foo
的表空间中创建:
begin ctx_ddl.create_preference('mystore', 'BASIC_STORAGE'); ctx_ddl.set_attribute('mystore', 'I_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); ctx_ddl.set_attribute('mystore', 'K_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); ctx_ddl.set_attribute('mystore', 'R_TABLE_CLAUSE', 'tablespace users storage (initial 1K) lob (data) store as (disable storage in row cache)'); ctx_ddl.set_attribute('mystore', 'N_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); ctx_ddl.set_attribute('mystore', 'I_INDEX_CLAUSE', 'tablespace foo storage (initial 1K) compress 2'); ctx_ddl.set_attribute('mystore', 'P_TABLE_CLAUSE', 'tablespace foo storage (initial 1K)'); end;
节组类型
为了发行上的文档节的WITHIN
查询,您必须创建分区组之前你定义你的部分。您在创建索引的参数子句中指定您的节组.
若要创建分区组,可以与 CTX_DDL 指定下面的组类型之一。CREATE_SECTION_GROUP程序:
节组的例子
本示例显示 HTML 和 XML 文档中的节组的使用。
在 HTML 文档中创建分区组
下面的语句创建使用 HTML 组类型调用htmgroup
的节组。
begin ctx_ddl.create_section_group('htmgroup', 'HTML_SECTION_GROUP'); end;
您可以选择添加节到此组在 CTX_DDL
包中,如CTX_DDL.ADD_SPECIAL_SECTION
或 CTX_DDL.ADD_ZONE_SECTION
。要索引您的文档,可以如发出一份声明:
create index myindex on docs(htmlfile) indextype is ctxsys.context parameters('filter ctxsys.null_filter section group htmgroup');
请参见:
上节组的详细信息,请参阅第 7 章,"CTX_DDL 包"创建的 XML 文档中的节组
下面的语句创建称为xmlgroup
与XML_SECTION_GROUP
组类型的节组。
begin ctx_ddl.create_section_group('xmlgroup', 'XML_SECTION_GROUP'); end;
您可以选择添加节到此组在 CTX_DDL
包中,如CTX_DDL.ADD_ATTR_SECTION
或CTX_DDL.ADD_STOP_SECTION
。要索引您的文档,可以如发出一份声明:
create index myindex on docs(htmlfile) indextype is ctxsys.context parameters('filter ctxsys.null_filter section group xmlgroup');
请参见:
上节组的详细信息,请参阅第 7 章,"CTX_DDL 包"分类类型
本节介绍用于创建 CTX_CLS 首选的分类类型。火车和 CTXRULE 创建索引。支持以下两个分类器类型:
RULE_CLASSIFIER
使用 RULE_CLASSIFIER 类型创建生成的过程中,CTX_CLS 的查询规则的首选。火车和 CTXRULE 创作。将生成带有这种类型的规则实质上是查询字符串和可以容易地审查。此分类器所产生的查询可以使用与,不,或有关运算符。查询字段路段仅支持范围运算符。
这种类型具有下列属性:
属性 | 数据类型 | 默认 | 最小值 | 最大值 | 描述 |
---|---|---|---|---|---|
THRESHOLD |
我 | 50 | 1 | 99 | 为规则生成指定阈值 (以百分比计算)。及其置信度大于阈值时,只有一条规则就是输出。 |
MAX_TERMS |
我 | 100 | 20 | 2000 | 对于每个类相关术语列表形式规则。指定条件,可以选择为每个类的最大数目。 |
MEMORY_SIZE |
我 | 500 | 10 | 4000 | 以 mb 为单位指定培训的内存使用情况。较大的值来提高性能。 |
NT_THRESHOLD |
F | 0.001 | 0 | 0.90 | 指定一个门槛,术语的选择。有两个阈值指导两个步骤中选择相关的条款。此阈值控制的行为的第一步。在此步骤中,术语被评为候选术语供进一步审议在第二步。当发生频次的训练集的文档数的比率大于此阈值,选用了词。 |
TERM_THRESHOLD |
我 | 10 | 0 | 100 | 为术语的选择百分比指定的阈值。此阈值控制第二步术语的选择。每个候选术语已计算暗示其相关性与给定类的数量。只有当在类中的所有候选术语的最大值及其量值比大于该阈值时,将为此类选择候选术语。 |
PRUNE_LEVEL |
我 | 75 | 0 | 100 | 指定多少修剪生成的决策树更好的覆盖。较高的值意味着更具侵略性的修剪和所产生的规则会有大的覆盖范围,但少的准确性。 |
SVM_CLASSIFIER
使用 SVM_CLASSIFIER 类型创建规则生成的过程中,CTX_CLS 的首选项。火车,和 CTXRULE 创作。这种分类器类型表示分类的支持向量机方法,并以二进制格式生成规则。当你需要分类精度高,可使用此分类器类型。
这种类型具有下列属性:
属性名称 | 数据类型 | 默认 | 最小值 | 最大值 | 描述 |
---|---|---|---|---|---|
MAX_DOCTERMS |
我 | 50 | 10 | 8192 | 指定表示一个文档的术语的最大数目。 |
MAX_FEATURES |
我 | 3,000 | 1 | 100,000 | 指定的最大数目的特色。 |
THEME_ON |
B | 假 | 空值 | 空值 | 指定对使用主题为特征。
分类与主题需要安装的知识库文章。知识库文章可能或不可能安装 Oracle 文本。在知识的基础上的详细信息,请参阅Oracle 文本应用程序开发人员指南. |
TOKEN_ON |
B | 真实 | 空值 | 空值 | 指定 TRUE,则使用常规令牌作为特征。 |
STEM_ON |
B | 假 | 空值 | 空值 | 指定对茎的使用令牌作为特征。时为词法分析器拐弯处 INDEX_STEM 方面,这才是有效的。 |
MEMORY_SIZE |
我 | 500 | 10 | 4000 | 以 mb 为单位指定近似的内存大小。 |
SECTION_WEIGHT |
1 | 2 | 0 | 100 | 指定用于在字段部分中作为一个正常的术语添加一个术语发生乘数。例如,默认情况下,"< > < /A > 的猫"一词只猫是一个字段节用语,被视为一个正常的术语发生等于 2,但您可以指定它被当作一个正常的期限与重量最大为 100。索引策略指定的字段部分时, SECTION_WEIGHT 才是有意义的。 |
群集类型
本节介绍用于创建CTX_CLS.CLUSTERING
程序。
请参见:
有关群集的详细信息,请参阅"集群"中第 6 章,"CTX_CLS 一揽子计划"以及Oracle 文本应用程序开发人员指南KMEAN_CLUSTERING
此聚类的类型具有下列属性:
属性名称 | 数据类型 | 默认 | 最小值 | 最大值 | 描述 |
---|---|---|---|---|---|
MAX_DOCTERMS |
我 | 50 | 10 | 8192 | 指定不同的术语,表示一个文档的最大数目。 |
MAX_FEATURES |
我 | 3,000 | 1 | 500,000 | 指定的最大数目的特色。 |
THEME_ON |
B | 假 | 空值 | 空值 | 指定对使用主题为特征。
聚类分析的主题需要安装的知识库文章。知识库文章可能或不可能安装 Oracle 文本。在知识的基础上的详细信息,请参阅Oracle 文本应用程序开发人员指南. |
TOKEN_ON |
B | 真实 | 空值 | 空值 | 指定 TRUE,则使用常规令牌作为特征。 |
STEM_ON |
B | 假 | 空值 | 空值 | 指定对茎的使用令牌作为特征。时为词法分析器拐弯处 INDEX_STEM 方面,这才是有效的。 |
MEMORY_SIZE |
我 | 500 | 10 | 4000 | 以 mb 为单位指定近似的内存大小。 |
SECTION_WEIGHT |
1 | 2 | 0 | 100 | 指定用于在字段部分中作为一个正常的术语添加一个术语发生乘数。例如,默认情况下,"< > < /A > 的猫"一词只猫是一个字段节用语,被视为一个正常的术语发生等于 2,但您可以指定它被当作一个正常的期限与重量最大为 100。索引策略指定的字段部分时, SECTION_WEIGHT 才是有意义的。 |
CLUSTER_NUM |
我 | 200 | 2 | 20000 | 指定叶簇生成的总量。 |
Stoplists
Stoplists 识别的文字在你的语言,不能被索引。在英语中,您还可以标识 stopthemes 不能被索引。默认情况下,该系统索引使用由系统提供的非索引,该字表对应于您的数据库语言的文本。
Oracle 文本为最常用的语言,包括英语、 法语、 德语、 西班牙语、 中文、 荷兰人和丹麦提供默认 stoplists。这些默认的 stoplists 包含只有字。
请参见:
关于提供的默认 stoplists 的详细信息,请参阅附录 E,"甲骨文文本提供 Stoplists".多语言 Stoplists
您可以创建多语言 stoplists 持有特定于语言的字。当您使用MULTI_LEXER
来索引包含在不同的语言如英语、 德语和日语文档的表,多语言的非索引字表很有用。
若要创建多语言非索引字表,请使用 CTX_DLL。CREATE_STOPLIST程序和指定的MULTI_STOPLIST
的非索引字表类型。您添加的语言特定字与 CTX_DDL。ADD_STOPWORD.
在索引的时间,每个文档的语言列进行检查,并且只用于该语言字被淘汰。在查询时,会话语言设置确定积极的字,像它确定的积极的词法分析器时使用多的词法分析器。
创建 Stoplists
您可以创建您自己的 stoplists 使用 CTX_DLL。CREATE_STOPLIST程序。您可以使用此过程创建BASIC_STOPLIST
为单一语言非索引字表,或者您可以创建多语言非索引字表为 MULTI_STOPLIST
。
当您创建您自己的非索引字表时,则必须指定在CREATE
INDEX
的参数子句中.
修改默认非索引字表
默认非索引字表总是被命名为CTXSYS。DEFAULT_STOPLIST。可以使用以下过程来修改此非索引字表:
-
CTX_DDL。ADD_STOPWORD
-
CTX_DDL。REMOVE_STOPWORD
-
CTX_DDL。ADD_STOPTHEME
-
CTX_DDL。ADD_STOPCLASS
当您修改CTXSYS.DEFAULT_STOPLIST
与CTX_DDL
软件包,您必须重新创建索引以使更改生效。
动态添加的字
您可以向默认值或自定义的非索引字表具有ALTER INDEX中动态地添加字。当您动态地添加 stopword 时,你需要不重新编制索引,因为这个词立即成为 stopword,从索引中删除。
注:
即使您可以动态添加索引的字,不能动态删除字。若要删除 stopword,您必须使用 CTX_DDL。REMOVE_STOPWORD,除去你的索引并重新创建它。系统定义的首选项
当您安装 Oracle 文本时,创建一些索引的偏好。可以在创建索引的参数子句中使用这些首选项,也可以定义你自己。
默认索引参数映射到一些这一节中描述的系统定义首选项。
请参见:
有关默认索引参数的详细信息,请参阅"默认索引参数" .系统定义的首选项分为以下类别:
词法分析器
本节讨论与词法分析器首选项关联的类型。
CTXSYS。DEFAULT_LEXER
默认的 lexer 取决于在安装时所使用的语言。以下各节描述了CTXSYS.DEFAULT_LEXER
为每种语言。
德国和德国 DIN语言设置
如果你的语言是德语,这种偏好使用BASIC_LEXER与启用下列选项:
-
区分大小写的索引 (
mixed_case
属性启用) -
复合索引 (
composite
的属性设置为GERMAN
) -
替换拼写 (
alternate_spelling
属性设置为GERMAN
)
芬兰、 挪威、 瑞典的语言设置
如果你的语言是芬兰语、 挪威语或瑞典语,这种偏好使用BASIC_LEXER与启用了以下选项:
-
替换拼写 (alternate_spelling 属性设置为
SWEDISH
)
非索引字表
本节讨论与非索引字表首选项关联的类型。
CTXSYS。DEFAULT_STOPLIST
此非索引字表首选项默认为您的数据库语言的非索引字表。
请参见:
停用词中提供的 stoplists 的完整列表,请参阅附录 E,"甲骨文文本提供 Stoplists".系统参数
本节介绍了 Oracle 文本系统参数。他们分为以下类别:
一般系统参数
当您安装 Oracle 文本之外的系统定义的首选项时,以下系统参数设置:
系统参数 | 描述 |
---|---|
MAX_INDEX_MEMORY |
这是可以在INDEX 的CREATE 和ALTER INDEX 参数子句中指定的最大索引内存. |
DEFAULT_INDEX_MEMORY |
这是默认的索引CREATE INDEX 和ALTER INDEX 所用的内存. |
LOG_DIRECTORY |
这是CTX_OUTPUT 日志文件的目录。 |
CTX_DOC_KEY_TYPE |
这是默认输入密钥类型,或ROWID 或PRIMARY_KEY , CTX_DOC 程序。在安装时设置为ROWID 。
请参见: CTX_DOC. SET_KEY_TYPE. |
您可以通过查询CTX_PARAMETERS视图查看系统默认值。您可以更改使用的 CTX_ADM.SET_PARAMETER程序的默认值。
默认索引参数
本节描述在创建上下文和 ctxcat 的索引时,您可以使用索引参数。
上下文索引参数
当您创建一个上下文索引时不指定首选项参数子句中创建索引时使用以下默认参数。每个默认参数命名系统定义的偏好,以用于数据存储、 过滤、 词法分析,等等。
参数 | 时使用 | 默认值 |
---|---|---|
DEFAULT_DATASTORE |
没有指定参数子句中CREATE INDEX 的数据存储首选项. |
CTXSYS。DEFAULT_DATASTORE |
DEFAULT_FILTER_FILE |
没有指定参数子句CREATE INDEX ,和满足下列条件之一的滤清器首选项是如此:
|
CTXSYS。AUTO_FILTER |
DEFAULT_FILTER_BINARY |
没有在CREATE INDEX 和 Oracle 文本参数子句中指定的筛选器偏好检测文本列数据类型是RAW ,LONG RAW 或BLOB . |
CTXSYS。AUTO_FILTER |
DEFAULT_FILTER_TEXT |
没有在CREATE INDEX 和 Oracle 文本参数子句中指定的筛选器偏好检测文本列数据类型是要么LONG 、 VARCHAR2 、 VARCHAR ,CHAR ,或CLOB . |
CTXSYS。NULL_FILTER |
DEFAULT_SECTION_HTML |
无节组CREATE INDEX ,并满足下列条件之一时的参数子句中指定 true:
|
CTXSYS。HTML_SECTION_GROUP |
DEFAULT_SECTION_TEXT |
没有CREATE INDEX ,和当你做时的参数子句中指定的节组不使用URL_DATASTORE 或AUTO_FILTER . |
CTXSYS。NULL_SECTION_GROUP |
DEFAULT_STORAGE |
没有指定参数子句中CREATE INDEX 的存储首选项. |
CTXSYS。DEFAULT_STORAGE |
DEFAULT_LEXER |
没有指定参数子句中CREATE INDEX 的 lexer 首选项. |
CTXSYS。DEFAULT_LEXER |
DEFAULT_STOPLIST |
在CREATE INDEX 参数子句中指定的任何非索引字表. |
CTXSYS。DEFAULT_STOPLIST |
DEFAULT_WORDLIST |
在CREATE INDEX 参数子句中指定没有单词表偏好. |
CTXSYS。DEFAULT_WORDLIST |
CTXCAT 索引参数
与创建索引创建一个 CTXCAT 索引和参数字符串中未指定任何参数时,就会使用下面的默认参数。CTXCAT 索引支持仅索引集、 词法分析器、 存储、 非索引字表和单词表参数。每个默认参数命名系统定义的首选项。
参数 | 时使用 | 默认值 |
---|---|---|
DEFAULT_CTXCAT_INDEX_SET |
设置指定的INDEX 的CREATE 参数子句中没有索引. |
|
DEFAULT_CTXCAT_STORAGE |
没有指定参数子句中CREATE INDEX 的存储首选项. |
CTXSYS。DEFAULT_STORAGE |
DEFAULT_CTXCAT_LEXER |
没有指定参数子句中CREATE INDEX 的 lexer 首选项. |
CTXSYS。DEFAULT_LEXER |
DEFAULT_CTXCAT_STOPLIST |
在CREATE INDEX 参数子句中指定的任何非索引字表. |
CTXSYS。DEFAULT_STOPLIST |
DEFAULT_CTXCAT_WORDLIST |
在CREATE INDEX 参数子句中指定没有单词表偏好.
请注意虽然您可以指定 |
CTXSYS。DEFAULT_WORDLIST |
CTXRULE 索引参数
当你创建CTXRULE
索引CREATE
INDEX
并在参数字符串中未指定任何参数,就会使用以下的默认参数。CTXRULE
索引支持的 lexer、 存储、 非索引字表和单词表参数。每个默认参数命名系统定义的首选项。
参数 | 时使用 | 默认值 |
---|---|---|
DEFAULT_CTXRULE_LEXER | 没有指定参数子句中CREATE INDEX 的 lexer 首选项. |
CTXSYS。DEFAULT_LEXER |
DEFAULT_CTXRULE_STORAGE | 没有指定参数子句中CREATE INDEX 的存储首选项. |
CTXSYS。DEFAULT_STORAGE |
DEFAULT_CTXRULE_STOPLIST | 在CREATE INDEX 参数子句中指定的任何非索引字表. |
CTXSYS。DEFAULT_STOPLIST |
DEFAULT_CTXRULE_WORDLIST | 在CREATE INDEX 参数子句中指定没有单词表偏好. |
CTXSYS.DEFAULT_WORDLIST |
DEFAULT_CLASSIFIER | No classifier preference is specified in parameter clause. | RULE_CLASSIFIER |
Viewing Default Values
You can view system defaults by querying the CTX_PARAMETERS view. For example, to see all parameters and values, you can issue:
SQL> SELECT par_name, par_value from ctx_parameters;
Changing Default Values
You can change a default value using the CTX_ADM.SET_PARAMETER procedure to name another custom or system-defined preference to use as default.