表字段
ID | VARCHAR2(30) | ID |
TITLE | VARCHAR2(256) | 标题 |
SUB_TITLE | VARCHAR2(256) | 副标题 |
CONTENT | CLOB | 内容 |
SUMMARY | CLOB | 简介 |
AUTHOR | VARCHAR2(256) | 作者 |
SOURCE | VARCHAR2(256) | 来源 |
首先给当前用户赋权:
--2.在ctxsys用户下,授予测试用户oratext以下权限:
GRANT resource, connect, ctxapp TO oratext;
GRANT execute ON ctxsys.ctx_cls TO oratext;
GRANT execute ON ctxsys.ctx_ddl TO oratext;
GRANT execute ON ctxsys.ctx_doc TO oratext;
GRANT execute ON ctxsys.ctx_output TO oratext;
GRANT execute ON ctxsys.ctx_query TO oratext;
GRANT execute ON ctxsys.ctx_report TO oratext;
GRANT execute ON ctxsys.ctx_thes TO oratext;
GRANT execute ON ctxsys.ctx_ulexer TO oratext;
一、建立一个preference
1、设置词法分析器
call ctx_ddl.create_preference('lexer_ccsp_plandynamic','chinese_vgram_lexer');
--call ctx_ddl.drop_preference('lexer_ccsp_plandynamic')(删除)
2、多列全文索引
call ctx_ddl.create_preference('mds_ccsp_plandynamic','MULTI_COLUMN_DATASTORE');
--call ctx_ddl.drop_preference('mds_ccsp_plandynamic')(删除)
3、指定检索字段
call ctx_ddl.set_attribute('my_mds1', 'columns', 'book_author, title, book_abstract');
二、.在title字段建立索引使用刚刚设置的my_lexer :chinese_vgram_lexer作为分析器
--CREATE INDEX demo_abstract ON textdemo(book_abstract) indextype IS ctxsys.context parameters('lexer my_lexer');
--创建全文索引 parallel 2 使用多少创建 一般为CPU的一半
create index index_ccsp_plandynamic on ccsp_plandynamic(title) indextype is ctxsys.context
parameters('datastore mds_ccsp_plandynamic lexer lexer_ccsp_plandynamic memory 200m');
(title可用任一字段代替--未测试)
三、
创建过滤词组
在我们建索引的时候,通常需要对一些常用的词组进行过滤,比如对公司名称进行检索时,肯定不希望输入“有限公司”、“公司”等关键词时,也会有搜索结果。
用testuser用户登录,执行下面的命令,创建过滤词组
exec ctx_ddl.create_stoplist('my_stoplist');
创建过滤词组成功以后,需要自定义需要过滤的词组
ctx_ddl.add_stopword('my_stoplist','有限公司');
ctx_ddl.add_stopword('my_stoplist','股份有限公司');
意思就是,创建了一个名为“my_stoplist”的过滤词组,“有限公司”、“股份有限公司”这两个词组不会被创建为索引
四、同步索引
call ctx_ddl.sync_index('index_demo_abstract',2048);
五、索引优化
call ctx_ddl.optimize_index('index_demo_abstract','FULL');
--drop index index_demo_abstract(删除索引)
commit;
六、.测试查询
--查询或
SELECT t.* FROM ccsp_plandynamict WHERE contains(TITLE,'移动城堡 or 俄罗斯 or 李')>0;
SELECT t.* FROM ccsp_plandynamict WHERE contains(TITLE,'DFFW')>0;
SELECT score(20),t.* FROM ccsp_plandynamict WHERE contains(TITLE,'移动城堡 or 欧洲',20)>0;
--基本查询
SELECT score(20),t.* FROM ccsp_plandynamic t WHERE contains(TITLE,'移动城堡',20)>0;
--查询包含多个词语and测试通过
SELECT score(20),t.* FROM ccsp_plandynamict WHERE contains(TITLE,'移动城堡 and 欧洲',20)>0;
七、报错
1、
---------------------------报错-----------------------
ORA-29855: 执行 ODCIINDEXCREATE 例行程序时出错
ORA-20000: Oracle Text 错误:
DRG-50857: oracle error in drvxtab.create_index_tables
ORA-01658: 无法为表空间 GXCOMMON 中的段创建 INITIAL 区
ORA-06512: 在 "CTXSYS.DRUE", line 160
ORA-06512: 在 "CTXSYS.TEXTINDEXMETHODS", line 364
--ORA-01658: 无法为表空间 GXCOMMON 中的段创建 INITIAL 区==========>可能是表空间不够
2、字段不能为narchar,否则不能创建索引。
八、demo
http://download.csdn.net/detail/chen_815/9830251