这篇文章会先容 Oracle Text 索引,旨在引导您了解创建文本索引、执行文本查询和维护文本索引的底子知识。
Oracle Text 为 Oracle 数据库提供全文索引功能,允许您通过指定内容中的单词、短语或其他文本模式来搜刮文本内容(比方 VARCHAR2 或 CLOB 数据)。
Oracle Text 是数据库的尺度组件,允许您在 Oracle 数据库中的文本数据中举行快速全文搜刮。比方,它可以让您在地点字段中查找拼写错误的单词,大概获取包含特定短语的 Microsoft Word 文档列表。
固然外貌上它类似于 LIKE 运算符的索引版本,但存在很多差异。
Oracle Text 对数据库中的文本内容创建基于单词(word-based)的索引。该内容的范围可以从 VARCHAR2 列中的几个单词到存储在 BLOB 列中的多章节 PDF 文档(甚至存储在文件系统外部、URL 或云存储上)。
这篇文章主要面向开发人员和 DBA,内容涵盖创建索引、根本搜刮功能和索引维护。
1. 整体流程
整体流程如下,
我们将创建一个名为“user_data”的简单表,此中包含客户信息。此中包括记录 ID 的数字列、客户名称的 VARCHAR2 列、订单金额的数字列以及贩卖代表所做的任何注释的 VARCHAR2 列。
我们将添补该表,然后在注释列上创建一个文本索引。
然后,我们将使用 Oracle Text CONTAINS 运算符完成各种类型的查询。我们还将在注释列上显示一些带有全文搜刮的混合查询,并在其他关系列上显示附加过滤器。
接下来,我们将了解如何同步和优化 Oracle Text 索引。
末了,我们将了解如何在对象存储上索引二进制文件,比方 Microsoft Word 或 PDF 文件。
2. 创建索引
2-1. 创建一个简单的表
我们将创建一个简单的表来保存模仿用户贩卖记录。它包含一个用于记录 ID 的数字列、一个用于客户名称的 varchar 列、另一个用于贩卖额的数字列以及另一个用于注释的 varchar 列。将以下内容复制到“工作表”区域,然后按“运行语句”按钮:
create table user_data
(id number,
name varchar2(100),
amount number(17,2),
note varchar2(2000)
)
复制代码
插入几行数据,
insert into user_data
select 1, 'John Smith', 123.45, 'First order from John Smith.' from dual
union
select 2, 'Mary Poppins', 67.89, 'First ever order from Marie Poppins.' from dual
union
select 3, 'John Smith', 99.45, 'Second order from Johnny Smith.' from dual
commit;
复制代码
查抄表中是否有数据,
select * from user_data
复制代码
2-2. 创建文本索引
文本索引是域索引(domain index)的一个示例。域索引是特定类型数据(或“域”)的专门索引。为了告诉内核要创建什么类型的索引,我们使用特殊语法“INDEXTYPE IS …”。最常见的文本索引类型,也是我们在这里使用的,是 CONTEXT 索引类型。
复制并运行以下 SQL,这将在表的 TEXT 列上创建索引。
create index myindex on user_data(note) indextype is ctxsys.context
复制代码
查抄数据库视图中的索引,
select index_name, index_type, status from user_indexes
where index_name = 'MYINDEX'
复制代码
如许就有了您的索引,index_type 为“DOMAIN”,状态为“VALID”。文本索引必须有用才能使用。在大型表上创建的索引大概会显示为 INPROGRS,这意味着索引创建正在举行中,但尚未准备好使用。
我们还可以在“文本数据字典”中查找。这是用户 CTXSYS 拥有的一组视图,专门用于 Oracle Text 索引。这些视图均以“CTX_”为前缀,所有用户都可以查看。运行以下命令:
select idx_name, idx_table, idx_text_name from ctx_user_indexes
文本索引作为一组底子表来实现。它们通常接纳 DR < i n d e x n a m e > <indexname> <indexname> 情势,此中后缀表示表的特定类型。通常不必要知道这些索引中有什么,但此中一个(“dollar I”表)特殊有趣。
留意:子表列表将随数据库版本和所选索引选项的不同而变化。您大概会看到与此处显示的列表不同的列表。
您应该看到列出了几个表。单击旁边的三角形,打开 DR M Y I N D E X MYINDEX MYINDEXI 的表定义。
我们看到一个列列表。我们主要感爱好的是 TOKEN_TEXT。
我们之前讨论了 Oracle Text 如何使用“基于单词”的索引。更准确地说,它使用“基于令牌”的索引,由于令牌不肯定是单词(只管通常是)。 “$I”表包含所有索引标记的列表,我们可以使用以下查询查看它们:
请留意,我们找到了包含单词“John”的一行。但是,我们没有找到包含“Johnny”的行。这阐明白 Oracle Text 搜刮与简单的 LIKE 搜刮(比方 WHERE TEXT LIKE ‘%John%’)之间的众多差异之一。 LIKE 执行子字符串搜刮,而 CONTAINS 则(默认情况下)查找整个单词。
您还可以尝试搜刮大写的 JOHN。你会得到雷同的效果。与 LIKE 搜刮不同,CONTAINS 搜刮(至少对于英文索引)不区分巨细写。
3-3. 混合查询
CONTAINS 是一个 SQL 运算符。当然,您可以将其与任何其他 WHERE 子句联合起来。比方,我们可以查找 AMOUNT 值小于 100 的单词“Smith”。让我们尝试一下:
select * from user_data
where amount < 100 and contains ( note, 'smith' ) > 0
假如您想在同一文档中查找两个单词,您可以执行 AND 搜刮,类似于上面的 OR 搜刮。假如您想一起查找两个单词,只需将它们作为短语输入即可。无需添加引号或任何内容,两个单词一起自动构成短语搜刮,并且仅当它们一起出现在索引文本中时才会匹配。
select * from user_data
where contains ( note, 'first order' ) > 0
复制代码
Note that only matches the first row where the actual phrase “first order” appears, and not the other row where the two words appear, but not as a phrase.
3-7. 模糊搜刮(Fuzzy searches)
您可以使用 NEAR 运算符查找相互接近的单词。它将查找相互指定距离内的单词。比方,以下查询未找到任何效果。由于“order”和“smith”之间有两个单词,但我们指定它们之间最多有 1 个单词。
select * from user_data
where contains ( note, 'near((order, smith), 1)' ) > 0
复制代码
下一个查询找到效果,由于它正确指定了“order”和“smith”之间的距离 2。
select * from user_data
where contains ( note, 'near((order, smith), 2)' ) > 0
复制代码
请留意,默认情况下,近运算符中的单词次序并不重要,除非 ORDER 参数显式设置为 TRUE。但在短语搜刮中,单词的次序确实很重要。
You can find a list of query operators here: Contains Query Operators.
4. 维护索引
到目前为止,我们已经了解了如何创建和查询 Oracle Text 索引。这是 Oracle Text 的底子知识,但我们必要讨论索引维护下的几个主题。
默认情况下,Oracle Text 索引不是事件性的。索引表发生更改后,必须先同步索引,然后才能通过搜刮找到新数据。
对 Oracle Text 索引举行多次更改后,由于索引碎片和垃圾(已删除)数据在索引中累积,其性能将达不到理想状态。为了让索引到达最佳状态,我们必须对其举行优化。
在本章节中,您将:
看到索引没有自动更新
了解如何手动或自动同步索引
看到索引随着时间的推移变得碎片化
了解如何优化索引
4-1. 同步
让我们向 USER_DATA 中插入一个新行。复制以下内容并单击“运行语句”按钮:
insert into user_data values (4, 'Mike Smith', 98.76, 'Third one from Mike Smith.');
您现在应该在创建 Oracle Text 索引、针对这些索引运行根本查询以及维护这些索引方面具备良好的底子。
5. 对象存储上的索引文件
在之前的实验中,我们向您展示了如何对简单的 VARCHAR2 文本举行索引。但 Oracle Text 的能力远不止于此。比方,它可以自动识别和处理约莫 150 种不同的二进制文件格式。有 PDF 文档吗?没问题。想要索引 Powerpoint 演示文稿中的所有文本吗?当然可以,为什么不呢?
Oracle Text 可以处理文件系统或 URL 上保存的文件,但对于本例,我们将把文件直接加载到数据库的 BLOB(二进制长对象)列中。
完成之前的所有实验后,此实验是可选的。您可以索引自己的文件,或使用我们提供的简单的 Microsoft Word 文件。
在本章节中,您将:
将文件复制到对象存储
创建“预授权哀求”URL 来访问这些文件
使用 DBMS_CLOUD.GET_OBJECT 将文件加载到数据库中
创建一个首选项,告诉 Text 使用 AUTO_FILTER
索引文件并使用内容词举行搜刮
5-1. 将文件加载到对象存储
转到 Oracle Cloud 中的主菜单(请留意,这与数据库操纵的菜单不同 - 它大概在不同的选项卡中打开)。
打开“汉堡包”菜单,然后选择“存储”,然后选择“对象存储和归档存储”下的存储桶。
在“存储桶”页面中,从“搜刮分区”框中选择您的根分区。
然后点击“创建存储桶”,您可以提供名称或仅保存默认名称。单击创建。
现在单击新创建的存储桶。
滚动到页面底部找到对象并单击上传。
在“上传对象”面板中,您可以使用文件选择器从计算机中选择某些 Office 或 PDF 文件,或将它们拖放到页面上。
假如您没有任何符合的文件,您可以从这里下载一个简单的 Microsoft Word 文档。
关于 PDF 文件的阐明:Oracle Text 无法处理纯图像的 PDF 文件(纵然它们是文本图像 - 我们没有 OCR 功能)。 PDF 文件必须嵌入文本。偶然,PDF 文件会受到文本访问掩护,或使用无法读取的特殊“位图”字体。不过,绝大多数 PDF 文件都可以使用。
选择文件后,单击“上传”按钮即可完成。然后单击“关闭”,您应该会看到存储桶中列出了您的文件。
为文件创建预验证哀求 (PAR)。
对于存储桶中的每个文件,我们必要创建一个“预验证哀求”。这是一个特殊的 URL,此中包含文件的嵌入式访问密钥。这意味着任何有权访问该 URL 的人都可以访问该文件,但现实上不大概猜测该 URL。
单击文件右侧的“三点”菜单,然后选择“创建预验证哀求”。
在弹出的面板上,选择“对象”,然后单击“创建预验证哀求”按钮。
您将看到一个“预验证哀求详细信息”面板,单击“复制”按钮复制 URL,然后将其保存到文本文件以供以后使用。对每个要索引的文件重复此操纵。
留意:不要担心可骇的“不会再显示”。您可以随时创建另一个 PAR。
5-2. 将文件加载到数据库中
select name, ctx_doc.snippet('DOCUMENTS_INDEX', rowid, 'world') from documents where contains (content, 'world') > 0
复制代码
假如您正在搜刮其他文档,请不要忘记将“world”更改两次。
CTX_DOC包含很多用于处理单个文档的函数。值得一看文档。
假如您已完成此可选模块,您就会知道 Oracle Text 可以处理的不仅仅是数据库中的短文本。为什么不尝试更多的文件呢?也许将“文档”文件夹中的所有文件加载到数据库中,最终,您将可以或许找到您多年前编写的难以捉摸的 Powerpoint,但不记得它的文件名。
6. (可选)情感分析
情绪分析可以回答“产品评论是正面还是负面?”等问题。或“客户满意还是不满意?”比方,从包含特定产品的多个评论的文档会合,您可以确定表明该产品是好还是坏的总体情绪。
Oracle Text 使用户可以或许使用经过训练以识别情感元数据的情感分类器对主题或文档执行情感分析。
Oracle Text 可以使用根本的内置“词袋”分类器(针对英文文本)执行情感分析。为了获得更好的效果或使用其他语言,您可以使用一组培训文档来训练您自己的分类器。
本章节将使用Oracle数据库创建一个分类器,并用它来分析一组有关相机评论的文档的情绪。
在本章节中,您将:
ctx_doc.sentiment_aggregate('camera_revidx', review_id) as default_sentiment,
ctx_doc.sentiment_aggregate('camera_revidx', review_id, clsfier_name => 'my_clsfier') as trained_sentiment
from camera_reviews order by trained_sentiment;
复制代码
You can find more details of sentiment analysis here: [Sentiment Analysis](You can find more details of sentiment analysis here: Sentiment Analysis.
).
refer: Full-Text Search in Oracle Database ShareStart
完结!