网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  如何利用oracle的全文索引实现切词功能     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:80次  录入:管理员--2008-02-27  
 

问题:给出一个中文语句,怎样才能对其实现切词功能功能?

解答:假如oracle全文索引的切词可以满足需求的话,那么可以借用oracle的功能来实现切词功能。

oracle的全文索引本身具备中文分析、切词功能,否则就无法有效的对中文进行搜索,如果这个切词结果可以满足要求的话,那么可以自己封装一个函数,来借用oracle的功能。

由于建立全文索引函数后,oracle会将切词结果放到dr$index_name$i表中,因此获取这个表中的记录就可以得到最终的切词结果。

建立自定义函数的时候注意,由于这个操作包括很多ddl操作,因此如果希望这个函数可以在sql中被调用,就必须使用自主事务。

为了方便的选择chinese_lexer还是chinese_vgram_lexer,将my_chinese_lexer的创建放到了函数之外,这样方便对切词规则进行修改。这个过程也是唯一需要在建立自定义函数之前做的步骤。

以下是实现这个功能的建立的例子:

sql> exec ctx_ddl.create_preference('my_chinese_lexer', 'chinese_vgram_lexer')

pl/sql 过程已成功完成。

sql> create or replace function f_split_chinese
(p_input in varchar2) return varchar2 as
2 pragma autonomous_transaction; v_return varchar2(32767);
3 begin
4 begin
5 execute immediate 'drop table t_temp_table purge';
6 exception
7 when others then
8 null;
9 end;
10 
11 execute immediate 'create table t_temp_table (str varchar2(4000))';
12 execute immediate 'insert into t_temp_table values (:str)' using p_input;
13 execute immediate 'create index ind_t_temp_table_str 
on t_temp_table(str) indextype is ctxsys.context
14 parameters(''lexer my_chinese_lexer'')';
15 execute immediate 'select max(ltrim
(sys_connect_by_path(token_text, '',''), '',''))
16 from 
17 (
18 select token_text, row_number() over(order by token_text) rn
19 from dr$ind_t_temp_table_str$i
20 ) 
21 start with rn = 1
22 connect by prior rn + 1 = rn' into v_return;
23 execute immediate 'drop table t_temp_table purge';
24 return v_return;
25 end;
26 /

函数已创建。

sql> select f_split_chinese('测试一下中文切词') from dual;

f_split_chinese('测试一下中文切词')
---------------------测试,词,切词,试一,文切,下中,一下,中文

sql> exec ctx_ddl.drop_preference('my_chinese_lexer')

pl/sql 过程已成功完成。

sql> exec ctx_ddl.create_preference('my_chinese_lexer', 'chinese_lexer')

pl/sql 过程已成功完成。

sql> select f_split_chinese('测试一下中文切词') from dual;

f_split_chinese('测试一下中文切词')
----------------------------------测试,词,切词,一下,中文

通过修改不同的lexer语法,可以明显的看出chinese_vgram_lexer和chinese_lexer在中文分词上的区别。关于二者区别的一些描述可以参考:http://yangtingkun.itpub.net/post/468/187632

需要注意的是,这个函数声明了自主事务,虽然可以在sql中调用,但是并不意味着这个函数不修改数据库中的内容。

这个函数在调用的过程中会执行建表、建立索引、删除表等一系列操作。因此调用这个函数的select语句,不但会引起数据库数据的变化,而且会导致ddl的发生,导致很多的递归调用、逻辑读和redo的产生。这是在使用这个函数之前需要理解的。

注释:此函数在oracle 10g的环境中完成,如果大家需要在oracle 9i版本中使用,必须将drop语句中的purge语句去掉,否则会出现语法错误。

 
 
上一篇: pfile创建spfile后数据库无法启动的问题    下一篇: 更改oracle用户名及外部用户验证的授权问题
  相关文档
oracle数据库中为什么会产生回滚与前退 04-18
oracle特殊包和"dbms_job"包的使用方法 (1) 01-31
讲解oracle移动数据文件到新分区的过程 03-11
教你轻松掌握Oracle内存结构 09-29
通过rman backup as copy移动数据文件 03-06
oracle 10g "dataguard"的日志传输方式 02-25
轻松解决oracle xdb的8080端口冲突问题 03-03
scn不一致将会导致ora-00600 2662错误 05-30
oracle数据库中使用dbms_profiler进行调优 05-07
正确认识oracle peeking绑定变量的控制 01-24
轻松掌握关闭oracle死锁进程的具体步骤 05-12
Oracle数据库字符集转换规律全面剖析 04-11
教你轻松掌握数据库链路的建立和使用 (1) 05-06
如何处理oracle中temp表空间满的问题 03-03
Oracle中用SQL语句实现进制间互相转换 07-07
ip地址变化后oracle 10g如何才能不受影响 04-15
通过几个步骤有效关闭oracle死锁进程 04-18
oracle数据库11g高级压缩特性 及压缩好处 09-22
用简单的方法获取oracle语句的执行时间 05-16
融会贯通oracle数据库的25条基本知识 02-29
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息