本文来详解一下如何自定义chinese_lexer此法分析器的词典
初始化数据
create table test2 (str1 varchar2(2000),str2varchar2(2000)) ;
insert into test2
values('地质图','中国和反馈砀山龙卷风流口水地质图') ;
insert into test2
values('图片','图') ;
commit ;
创建此法分析器并且创建全文索引(注意词典只对chinese_lexer起作用)
exec ctx_ddl.create_preference('my_lexer1','CHINESE_LEXER');
EXEC ctx_ddl.create_preference('dataquery','MULTI_COLUMN_DATASTORE');
EXEC ctx_ddl.set_attribute('dataquery','columns', 'str1,str2');
CREATE INDEX test2_idx ON test2(str1) INDEXTYPEIS ctxsys.CONTEXT PARAMETERS('datastore dataquery LEXER my_lexer1');
看一下生成的词表,可以看到,是没有地质图这个关键字的。
ctx@STARTREK>select * from DR$TEST2_IDX$I ;
TOKEN_TEXT TOKEN_TYPE TOKEN_FIRST TOKEN_LAST TOKEN_COUNT
-------------------------------------------------------------------------- ----------- ---------- -----------
TOKEN_INFO
-----------------------------------------------------------------------------------------------------------------------------------------------------
STR1 0 1 2 2
0090010301900102
STR2 0 1 2 2
0090050B01900402
地质 0 1 1 1
0090020C
反馈 0 1 1 1
008808
和 0 1 1 1
008807
口水 0 1 1 1
00880D
流 0 1 1 1
00880C
龙卷风 0 1 1 1
00880B
山 0 1 1 1
00880A
图 0 1 2 2
0090030C018805
图片 0 2 2 1
008802
中国 0 1 1 1
008806
砀山 0 1 1 1
008809
已选择13行。
下面开始,使用自定义词典
C:\Users\fengjun>ctxlc -zht -ocs zhs16GBK> zhs16gbk_102.txt
C:\Users\fengjun>zhs16gbk_102.txt
搜索了一下文档,里面没有找到地质图这个关键词
最末尾加上地质图
生成自定义词典需要使用的三个以d、k、i结尾的文件
这里总是出错
C:\Users\fengjun>ctxlc -zht -ics zhs16gbk -izhs16gbk_102.txt
DRG-52107: ctxkbtc internal error
加上-n参数,顺利生成
C:\Users\fengjun>ctxlc -zht -ics zhs16gbk -n-i zhs16gbk_102.txt
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
DRG-52118: Writing index file for terms
DRG-52117: Writing index file for IDs
DRG-52116: Done writing all terms
DRG-52115: Writing new terms in lexicon tofiles
DRG-52114: Writing lexicon to files
C:\Users\fengjun>dir dr*
驱动器 C 中的卷是Windows8_OS
卷的序列号是6C5D-2B1F
C:\Users\fengjun 的目录
2014/09/24 14:02 2,250,471 drold.dat
2014/09/24 14:02 391,326 droli.dat
2014/09/24 14:02 89,282 drolk.dat
2014/09/24 13:55 298,206 drolt.dat
4 个文件 3,029,285 字节
0 个目录 113,255,260,160 可用字节
备份$ORACLE_HOME\ctx\data\zhlx
下的内容,并且将上面的几个文件copy到$ORACLE_HOME\ctx\data\zhlx下,并且改名
d、k、i结尾的拷贝过去即可
一定记得将原来的文件备份一下。
ctx@STARTREK>drop index test2_idx force ;
索引已删除。
ctx@STARTREK>CREATE INDEX test2_idx ONtest2(str1) INDEXTYPE IS ctxsys.CONTEXT PARAMETERS('datastore dataquery LEXERmy_lexer1');
索引已创建。
ctx@STARTREK>select * from DR$TEST2_IDX$I ;
TOKEN_TEXT TOKEN_TYPE TOKEN_FIRST TOKEN_LAST TOKEN_COUNT
-------------------------------------------------------------------------- ----------- ---------- -----------
TOKEN_INFO
--------------------------------------------------------------------------------------------------------------------------
STR1 0 1 2 2
0090010201900102
STR2 0 1 2 2
0090040A01900402
地质图 0 1 1 1
0090020B
反馈 0 1 1 1
008807
和 0 1 1 1
008806
口水 0 1 1 1
00880C
流 0 1 1 1
00880B
龙卷风 0 1 1 1
00880A
山 0 1 1 1
008809
图 0 2 2 1
008805
图片 0 2 2 1
008802
中国 0 1 1 1
008805
砀山 0 1 1 1
008808
已选择13行。
可以看到已经有地质图这个关键字了。
这样自定义词典就完成了,对于大数据量的检索,自定义词典还是非常有意义的。
下面是一个相关的简单测试
未加关键词之前
SQL> select count(0) from data_query t wherecontains(MDTITILE,'xxxx万地质图')>0;
COUNT(0)
----------
7072
已用时间: 00: 00: 01.54
执行计划
----------------------------------------------------------
Plan hash value: 670767155
--------------------------------------------------------------------------------
---
| Id |Operation | Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
---
| 0 |SELECT STATEMENT | | 1 | 85 | 4 (0)| 00:00:0
1 |
| 1| SORT AGGREGATE | | 1 | 85 | |
|
|* 2| DOMAIN INDEX | DATA_QUERY_IDX | 164 | 13940 | 4 (0)| 00:00:0
1 |
--------------------------------------------------------------------------------
---
Predicate Information (identified by operationid):
---------------------------------------------------
2 - access("CTXSYS"."CONTAINS"("MDTITILE",'xxxx万地质图')>0)
统计信息
----------------------------------------------------------
3528 recursive calls
0 db block gets
10214 consistent gets
1173 physical reads
2824 redo size
535 bytes sent via SQL*Net to client
524 bytes received via SQL*Netfrom client
2 SQL*Net roundtrips to/fromclient
263 sorts (memory)
0 sorts (disk)
1 rows processed
加关键词之后
SQL> select count(0) from data_query t wherecontains(MDTITILE,'xxxx万地质图')>0 ;
COUNT(0)
----------
7072
已用时间: 00: 00: 00.28
执行计划
----------------------------------------------------------
Plan hash value: 670767155
--------------------------------------------------------------------------------
---
| Id |Operation | Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
---
| 0 |SELECT STATEMENT | | 1 | 85 | 4 (0)| 00:00:0
1 |
| 1| SORT AGGREGATE | | 1 | 85 | |
|
|* 2| DOMAIN INDEX | DATA_QUERY_IDX | 164 | 13940 | 4 (0)| 00:00:0
1 |
--------------------------------------------------------------------------------
---
Predicate Information (identified by operationid):
---------------------------------------------------
2 -access("CTXSYS"."CONTAINS"("MDTITILE",'xxxx万地质图')>0)
统计信息
----------------------------------------------------------
643 recursive calls
0 db block gets
2438 consistent gets
34 physical reads
0 redo size
535 bytes sent via SQL*Net toclient
524 bytes received via SQL*Netfrom client
2 SQL*Net roundtrips to/fromclient
34 sorts (memory)
0 sorts (disk)
1 rows processed
相关官方文档位置:
Oracle® Text Reference |
http://docs.oracle.com/cd/E11882_01/text.112/e24436/cexec.htm#CCREF2202