oracle 存储过程|oracle 全文索引详细做法

时间:2017-03-02  来源:全文检索  阅读:

oracle 全文索引详细做法


Oracle从7.3开始支持全文检索,即用户可以使用Oracle服务器的上下文(ConText)选项完成基于文本的查询。具体可以采用通配符查找、模糊匹配、相关分类、近似查找、条件加权和词意扩充等方法。在Oracle8.0.x中称为ConText ;在Oracle8i中称为interMedia Text ; Oracle9i中称为Oracle Text。

Oracle Text是9i标准版和企业版的一部分。Oracle9i将全文检索功能做为内置功能提供给用户,使得用户在创建数据库教程实例时自动安装全文检索。Oracle Text的应用领域有很多:

l         搜索文本 :需要快捷有效搜索文本数据的应用程序。

l         管理多种文档:允许搜索各种混和文档格式的应用程序,包括ord,excel,lotus等。

l         从多种数据源中检索文本:不仅来自Oracle数据库中的文本数据,而且可以来自Internet和文件系统的文本数据。

l         搜索XML应用程序。

 

GRANT CTXAPP TO XYADMIN;
 Begin
    -- 定义一个词法分析器
    --ctx_ddl.drop_preference("cnlex");
    --ctx_ddl.create_preference("cnlex","CHINESE_LEXER");  --针对中文
    ctx_ddl.create_preference("cnlex","chinese_vgram_lexer");  --针对中文
    -- 定义一个相关词表
    --ctx_ddl.drop_preference("mywordlist");
    --ctx_ddl.create_preference("mywordlist", "BASIC_WORDLIST");
    --ctx_ddl.set_attribute("mywordlist","PREFIX_INDEX","TRUE");
    --ctx_ddl.set_attribute("mywordlist","PREFIX_MIN_LENGTH",1);
    --ctx_ddl.set_attribute("mywordlist","PREFIX_MAX_LENGTH", 5);
    --ctx_ddl.set_attribute("mywordlist","SUBSTRING_INDEX", "YES");
  end;
 
COMMIT;
drop index CorporationName_index force
drop index BusinessScope_index force

--CREATE INDEX CorporationName_index ON CorporationMainTable(CorporationName) indextype is ctxsys.context
--parameters ("DATASTORE CTXSYS.DIRECT_DATASTORE FILTER
--CTXSYS.NULL_FILTER LEXER cnlex WORDLIST mywordlist");

CREATE INDEX CorporationName_index ON CorporationMainTable(CorporationName) indextype is ctxsys.context PARAMETERS ("lexer cnlex");
CREATE INDEX BusinessScope_index ON CorporationMainTable(BusinessScope) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS ("lexer cnlex");

 

exec ctx_ddl.sync_index("CorporationName_index");

-- sync:
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,"ctx_ddl.sync_index(""CorporationName_index"");
ctx_ddl.sync_index(""BusinessScope_index"");
ctx_ddl.sync_index(""LegalRepresentative_index"");",
SYSDATE, "SYSDATE + (1/24/4)");
commit;
END;

-- optimizer
VARIABLE jobno number;
BEGIN
DBMS_JOB.SUBMIT(:jobno,"ctx_ddl.optimize_index(""CorporationName_index"",""FULL"");
ctx_ddl.optimize_index(""BusinessScope_index"",""FULL"");
ctx_ddl.optimize_index(""LegalRepresentative_index"",""FULL"");",
SYSDATE, "SYSDATE + 1");
commit;
END;
grant execute any procedure to CREDIT_CORP;
exec dbms_job.run(73);
exec dbms_job.remove(69);
exec dbms_job.remove(72);
select * from user_jobs;

--其中,第一个job的SYSDATE + (1/24/4)是指每隔15分钟同步一次,第二个job的SYSDATE + 1是每隔1天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定。至此,你的全文检索功能已设置完成。

搜索文本

       不使用Oracle text功能,也有很多方法可以在Oracle数据库中搜索文本.可以使用标准的INSTR函数和LIKE操作符实现.

SELECT *

  FROM  mytext

 WHERE  INSTR (thetext, "Oracle") > 0;

SELECT *

  FROM mytext

 WHERE thetext LIKE "%Oracle%";

有很多时候,使用instr和like是很理想的,特别是搜索仅跨越很小的表的时候。然而通过这些文本定位的方法将导致全表扫描,对资源来说消耗比较昂贵,而且实现的搜索功能也非常有限。

利用Oracle Text,你可以回答如“在存在单词’Oracle’的行同时存在单词’Corporation’而且两单词间距不超过10个单词的文本,查询含有单词’Oracle’或者单词’california’的文本,并且将结果按准确度进行排序,含有词根train的文本”,以下的sql代码实现了如上功能,我们且不管这些语法是如何使用的:

DROP INDEX index mytext_idx;  --丢弃索引mytext_idx

/

CREATE INDEX mytext_idx

ON mytext( thetext )

INDEXTYPE is CTXSYS.CONTEXT; --创建CONTEXT类型索引mytext_idx

/

SELECT id

  FROM mytext

 WHERE contains (thetext, "near((Oracle,Corporation),10)") > 0; --发出contains查询

SELECT score (1), id

    FROM mytext

   WHERE contains (thetext, "Oracle or california", 1) > 0

ORDER BY score (1) DESC

/

SELECT id

  FROM mytext

 WHERE contains (thetext, "$train") > 0;

 

--其中,第一个job的SYSDATE + (1/24/4)是指每隔15分钟同步一次,第二个job的SYSDATE + 1是每隔1天做一次全优化。具体的时间间隔,你可以根据自己的应用的需要而定。至此,你的全文检索功能已设置完成。

oracle 存储过程|oracle 全文索引详细做法

http://m.bbyears.com/aspjiaocheng/30869.html

推荐访问:oracle数据库
相关阅读 猜你喜欢
本类排行 本类最新