zoukankan      html  css  js  c++  java
  • Oracle 11g Release 1 (11.1) Oracle Text——演示创建 Oracle Text 索引

    http://docs.oracle.com/cd/B28359_01/text.111/b28303/quicktour.htm#g1011793

    本文内容

    • 概述
    • 创建一个 Oracle 全文检索用户
    • 演示如何使用 CONTEXT 索引
    • 演示如何使用 CTXCAT 索引
    • 演示如何使用 CTXRULE  索引
    • 本 BLOG 相关链接
    • 修改记录

    概述

    本文描述如何创建一个 Oracle 全文检索开发者用户,以及生成一个简单的文本查询,和目录一个应用程序。对于每个应用程序类型,本文通过基本的 SQL 语句一步步介绍加载、索引和查询。

    创建一个 Oracle 全文检索用户


    在使用 Oracle 全文检索的索引和其 PL/SQL 包之前,需要创建一个带 CTXAPP 角色的用户。该角色使你可以做如下事情:

    • 创建和删除 Oracle 全文检索的索引引用
    • 使用 Oracle 全文检索 PL/SQL 包

    若进行全文检索,以数据库管理员身份登录,按下面步骤:

    1)创建用户。建一个用户名/密码为 MYUSER / myuser_password 的用户:

    CREATE USER myuser IDENTIFIED BY myuser_password;

    2)授权角色。为该用户授权 RESOURCECONNECTCTXAPP 角色:

    GRANT RESOURCE, CONNECT, CTXAPP TO MYUSER;

    3)授权执行 CTX PL/SQL 包的权限

    Oracle 全文检索包含很多包,可以让你完成从同步 Oracle 全文检索索引到高亮显示文本的所有动作。例如,CTX_DDL 包包含了 SYNC_INDEX 过程,该存储过程可以同步全文检索的索引。

    若想调用这些存储过程,你的应用程序需要有执行这些包的权限。例如,为 MYUSER 用户授权执行所有 Oracle 全文的包的权限,如下代码:

    GRANT EXECUTE ON CTXSYS.CTX_CLS TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_DDL TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_DOC TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_OUTPUT TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_QUERY TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_REPORT TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_THES TO myuser;
    GRANT EXECUTE ON CTXSYS.CTX_ULEXER TO myuser;

    演示如何使用 CONTEXT 索引


    建立索引

    在一个基于文本查询的应用程序中,用户输入查询关键字或词组,期望应用程序返回一个最匹配该查询的文本列表。该应用程序涉及创建一个 CONTEXT 索引,并用 CONTAINS 查询。

    本例通过 SQL 语句按步骤加载文本到表,并创建索引,以及查询索引。最典型的是,查询应用程序需要一个用户接口。下面例子演示如何利用 CONTEXT  索引创建一个查询应用程序。

    1)使用 myuser 用户连接数据库。在创建表之前,先用 myuser 用户连接数据库。

    CONNECT myuser;

    2)创建表

    创建一个有两列,idtextdocs 表。id 为主键;text 类型为 VARCHAR2

    CREATE TABLE docs (id NUMBER PRIMARY KEY, text VARCHAR2(200));

    3)插入新数据

    INSERT INTO docs VALUES(1, '<HTML>California is a state in the US.</HTML>');
    INSERT INTO docs VALUES(2, '<HTML>Paris is a city in France.</HTML>');
    INSERT INTO docs VALUES(3, '<HTML>France is in Europe.</HTML>');

    4)创建 CONTEXT 索引

    text 列上,通过 CONTEXT  索引为 HTML 文本创建索引。因为是 HTML 文本,所以本例使用不过滤的 NULL_FILTER 引用类型和 HTML_SECTION_GROUP 类型。

    CREATE INDEX idx_docs ON docs(text)
         INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS
         ('FILTER CTXSYS.NULL_FILTER SECTION GROUP CTXSYS.HTML_SECTION_GROUP');

    使用 NULL_FILTER 是因为你不需要在创建索引时过滤 HTML 文本。然而,如果是为 PDF、MS Word,或是其他格式化文本创建索引,那么应该使用 CTXSYS.AUTO_FILTER(默认)作为你的过滤引用。

    本例建议使用 HTML_SECTION_GROUP 节分组。使用该类型可以使你在特定的 HTML 标记内检索,减少把不期望的标记也建成索引,例如字体信息。

    查询

    1)使用 CONTAINS 查询表

    为了增加可读性,首先,设置 SELECT 语句的输出格式。设置 text 列的宽度为 40 个字符。

    COLUMN text FORMAT a40;

    现在用带 CONTAINSSELECT 语句查询表。下面查询检索所有包含 "France" 的文本:

    SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'France', 1) > 0;
     
      SCORE(1)         ID TEXT
    ---------- ---------- ----------------------------------------
             4          3 <HTML>France is in Europe.</HTML>
             4          2 <HTML>Paris is a city in France.</HTML>

    2)显示文本

    在实际应用程序中,你需要为用户显示检索出来的文本,并高亮显示检索的词条。Oracle 全文检索可以让你用 CTX_DOC  来标记文本。

    下面通过一个匿名的 PL/SQL 块演示 HTML 文本标记。然而,在实际应用程序中,你需要在浏览器中呈现文本。

    SET SERVEROUTPUT ON;
    DECLARE
      2  mklob CLOB;
      3  amt NUMBER := 40;
      4  line VARCHAR2(80);
      5  BEGIN
      6    CTX_DOC.MARKUP('idx_docs','3','France', mklob);
      7    DBMS_LOB.READ(mklob, amt, 1, line);
      8    DBMS_OUTPUT.PUT_LINE('FIRST 40 CHARS ARE:'||line);
      9    DBMS_LOB.FREETEMPORARY(mklob);
     10    END;
     11  /
    FIRST 40 CHARS ARE:<HTML><<<France>>> is in Europe.</HTML>
     
    PL/SQL procedure successfully completed.

    3)操作数据后同步索引

    当创建一个 CONTEXT 索引时,插入、更新或删除后,需要显示同步索引。Oracle 全文检索可以通过 CTX_DDL.SYNC_INDEX 过程来完成。

    docs 表再添加两行:

    INSERT INTO docs VALUES(4, '<HTML>Los Angeles is a city in California.</HTML>');
    INSERT INTO docs VALUES(5, '<HTML>Mexico City is big.</HTML>');

    因为,索引未同步,新的数据行没有检索出来:

    SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'city', 1) > 0;
     
      SCORE(1)         ID TEXT
    ---------- ---------- --------------------------------------------------
             4          2 <HTML>Paris is a city in France.</HTML>

    用 2Mb 的内存同步索引,返回查询结果:

    COLUMN text FORMAT a50;
    SELECT SCORE(1), id, text FROM docs WHERE CONTAINS(text, 'city', 1) > 0;
     
      SCORE(1)         ID TEXT
    ---------- ---------- --------------------------------------------------
             4          5 <HTML>Mexico City is big.</HTML>
             4          4 <HTML>Los Angeles is a city in California.</HTML>
             4          2 <HTML>Paris is a city in France.</HTML>

    参考:

    本 BLOG 的“Oracle 11g Release 1 (11.1) Oracle Text 如何创建 CONTEXT 索引

    演示如何使用 CTXCAT 索引


    创建表和插入数据

    本节演示为一个拍卖站点创建目录索引,该站点销售如摄像机和 CD 播放器等电子设备。新的条目每天都会增加,包括条目描述、拍卖日期和价格。

    应用程序查询需要良好的响应时间。关键是确定用户频繁检索哪个列,以创建合适的 CTXCAT 索引。该类型索引的查询需要 CATSEARCH 操作符。

    假设,数据库有个 myuser 用户。

    1)用 myuser 用户连接数据库

    SQL> CONNECT myuser;

    2)创建 auction

    SQL> CREATE TABLE auction(
      2  item_id NUMBER,
      3  title VARCHAR2(100),
      4  category_id NUMBER,
      5  price NUMBER,
      6  bid_close DATE);
     
    Table created
     
    SQL> 

    3)向该表插入 4 条数据

    SQL> INSERT INTO AUCTION
      2  VALUES
      3    (1, 'NIKON CAMERA', 1, 400, to_date('2012-8-1', 'yyyy-mm-dd'));
     
    1 row inserted
    SQL> INSERT INTO AUCTION
      2  VALUES
      3    (2, 'OLYMPUS CAMERA', 1, 300, to_date('2012-8-5', 'yyyy-mm-dd'));
     
    1 row inserted
    SQL> INSERT INTO AUCTION
      2  VALUES
      3    (3, 'PENTAX CAMERA', 1, 200, to_date('2012-8-10', 'yyyy-mm-dd'));
     
    1 row inserted
    SQL> INSERT INTO AUCTION
      2  VALUES
      3    (4, 'CANON CAMERA', 1, 250, to_date('2012-8-20', 'yyyy-mm-dd'));
     
    1 row inserted
     
    SQL> 
    创建 CTXCAT 索引

    1)确定查询。确定可能检索的标准是什么。本节所有的查询使用 title 列,并按 price 排序。当使用 CATSEARCH 操作符后,我们将为 title 列指定条目,并为结构化子句指定标准。

    2)创建一个子索引以便按 price 字段排序

    为了使 Oracle 全文检索更有效地执行查询,我们需要一个 price 列的子索引。因为,查询将按 price 排序。

    因此,创建一个名为 "auction_iset" 索引集,并添加一个 price 列子索引。

    SQL> EXEC CTX_DDL.create_index_set('auction_iset')
     
    PL/SQL procedure successfully completed
     
    SQL> EXEC CTX_DDL.add_index('auction_iset','price')
     
    PL/SQL procedure successfully completed
     
    SQL>

    3)在 auction 表的 title 列上创建 CTXCAT 索引

    SQL> CREATE INDEX auction_titlex ON AUCTION(title) INDEXTYPE IS CTXSYS.CTXCAT PARAMETERS ('index set auction_iset');
     
    Index created
     
    SQL> 

    拍卖表的模式(表结构)和 CTXCAT 索引

    拍卖表的模式(表结构)和 CTXCAT 索引

    4)用 CATSEARCH  查询。需要使用 CATSEARCH 操作查询 CTXCAT 索引。

    SQL> SELECT title, price
      2    FROM auction;
     
    TITLE                     PRICE
    -------------------- ----------
    NIKON CAMERA                400
    OLYMPUS CAMERA              300
    PENTAX CAMERA               200
    CANON CAMERA                250
     
    SQL> 
    SQL> SELECT title, price
      2    FROM auction
      3   WHERE CATSEARCH(title, 'CAMERA', 'order by price') > 0;
     
    TITLE                     PRICE
    -------------------- ----------
    PENTAX CAMERA               200
    CANON CAMERA                250
    OLYMPUS CAMERA              300
    NIKON CAMERA                400
     
    SQL> 

    5)插入新数据后,再查询。

    SQL> INSERT INTO AUCTION
      2  VALUES
      3    (5, 'FUJI CAMERA', 1, 350, to_date('2012-9-10', 'yyyy-mm-dd'));
     
    1 row inserted
    SQL> INSERT INTO AUCTION
      2  VALUES
      3    (6, 'SONY CAMERA', 1, 310, to_date('2012-9-22', 'yyyy-mm-dd'));
     
    1 row inserted
    SQL> SELECT title, price
      2    FROM auction
      3   WHERE CATSEARCH(title, 'CAMERA', 'order by price') > 0;
     
    TITLE                     PRICE
    -------------------- ----------
    PENTAX CAMERA               200
    CANON CAMERA                250
    OLYMPUS CAMERA              300
    SONY CAMERA                 310
    FUJI CAMERA                 350
    NIKON CAMERA                400
     
    6 rows selected
     
    SQL> 

    注意:新添加的数据是如何立即在查询中显示出来的。

    如何使用 CTXRULE 索引


    分类应用程序的功能是基于文档内容执行一些动作。这些动作可以为一个文档分配一个目录 ID,或是发送文档给一个用户。这个结果就是文档分类。

    文档根据预定义的规则被分类。这些规则选择一个目录。例如,一个 'presidential elections' 规则可能选择一个关于 politics 类别的文档。

    Oracle 全文检索提供很多类型的分类。这里讨论一个最简单、基于规则的分类,它要创建文档目录以及目录文档的规则。对于监督分类,Oracle 全文检索从提供的文档集合中派生规则。对于聚类,Oracle 全文检索也会这样做,派生规则和目录。

    为了实现 Oracle 全文检索中简单分类,创建规则,它本质上查询一个表。在一个 CTXRULE 索引中创建这些规则索引。为了分类一个到达的文本,在 SELECT 语句的 WHERE 子句中使用 MATCHES 操作符。 ccapp018

    一个文档分类应用程序

    下面例子一步步演示通过定义简单的目录,创建一个 CTXRULE 索引,并使用 MATCHES 来分类文档。

    1)用 myuser 用户连接数据库

    CONNECT myuser;

    2)创建表

    必须创建一个规则表,并用查询规则填充。本例,我们创建一个名为 "queries" 表。每行定义一个带 ID 的目录,和一个查询字符串的规则:

    CREATE TABLE queries (
          query_id      NUMBER,
          query_string  VARCHAR2(80)
        );
     
        INSERT INTO queries VALUES (1, 'oracle');
        INSERT INTO queries VALUES (2, 'larry or ellison');
        INSERT INTO queries VALUES (3, 'oracle and text');
        INSERT INTO queries VALUES (4, 'market share');

    3)创建 CTXRULE 索引

    CREATE INDEX queryx ON queries(query_string) INDEXTYPE IS CTXRULE;

    4)用 MATCHES 分类

    使用 MATCHES 操作匹配文档,这样就分类了。

    COLUMN query_string FORMAT a35;
        SELECT query_id,query_string FROM queries
         WHERE MATCHES(query_string, 
                       'Oracle announced that its market share in databases 
                        increased over the last year.')>0;
     
      QUERY_ID QUERY_STRING                                                         
    ---------- -----------------------------------                                  
             1 oracle                                                               
             4 market share  

    如上所示,文档字符串匹配目录 1 和 4。你可以使用分类执行一个动作,比如写文档到一个特定的表,或发送 mail 给一个用户。

    本 BLOG 相关链接


    修改记录


    • 第一次 2012-8-23 [UPDATE] 演示如何使用 CTXCAT 索引
  • 相关阅读:
    在Python中调用C++模块
    [转载]科学家真懂统计学吗?
    [原]基因组变异检测概述
    [原]测序量估计
    软考之路—解答数据流图
    软考之路-搞定ER图到关系模式
    软考之路-网络攻击:主动攻击和被动攻击
    软考之路-计算机病毒
    初识ADO.net-访问数据的两种方式
    vb.net小试三层架构
  • 原文地址:https://www.cnblogs.com/liuning8023/p/2432605.html
Copyright © 2011-2022 走看看