我非要弄明白不可,对BLOB的全文检索,解决了另开贴放分!

解决方案 »

  1.   

    http://www.yesky.com/SoftChannel/72342371928965120/20030802/1718653.shtml
      

  2.   

    我做第三部,做索引项的时候出错ORA-06550: line 2, column 1:
    PLS-00904: insufficient privilege to access object CTXSYS.CTX_DDL
    ORA-06550: line 2, column 1:
    PL/SQL: Statement ignored
    ORA-06550: line 4, column 1:
    PLS-00904: insufficient privilege to access object CTXSYS.CTX_DDL
      

  3.   

    现在我按着这个从头到尾
    http://www.yesky.com/SoftChannel/72342371928965120/20030802/1718653.shtml
    都做了一遍,结果和原来一样,对中文检索不好使!!
    晕..
      

  4.   

    原来我都建立的对,就是对中文检索不好使CONTAINS (Content, '广州') > 0;
    没有数据CONTAINS (Content, '1') > 0;数据
      

  5.   

    不知道oracle内部是如何处理的
    contains后面这个参数没有规定是那些类型吗?
      

  6.   

    我先整理我建的过程,数据库是9I,供大家研究和讨论,我问题到底处在哪里??1,首先我建个表
        Info_Content(Info_Id,Content),并且里面放入了一批数据,用程序调用显示正常.
        Info_Id,Number
        Content,BLOB
    2,接着,我当前用户本身有 权利建索引项,所以直接不需要用SYSTEM在搜权,直接建立索引项
    begin
      ctx_ddl.create_preference('mylex','BASIC_LEXER');
      ctx_ddl.set_attribute('mylex','printjoins','_-');
      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;
    begin
      ctx_ddl.create_preference('cnlex','CHINESE_LEXER');
    end; 
      说句实话,这里我不是很清楚,我只是照搬!!
      
      提示成功了
      
      Commit;
      
    3,建索引(当前用户为 User05 Create Index i_Info_Content_table on Info_Content(Content) 
     indextype is ctxsys.context 
     parameters ('DATASTORE CTXSYS.DIRECT_DATASTORE 
     FILTER CTXSYS.INSO_FILTER 
     LEXER User05.CNLEX 
     WORDLIST User05.MYWORDLIST');
     
     提示成功
     
     Commit;
     
    4,就是 用了 Select * From Info_Content Where CONTAINS (Content, '广州',1) > 0;
     
     无数据
     
     ------
     
     Select * From Info_Content Where CONTAINS (Content, '1',1) > 0;
     
     有数据
     
     -----
     
     Select * From Info_Content Where CONTAINS (Content, 'a',1) > 0;
     
     无数据
     
     实际中,我输入的中文关键词和英文都是有的,但就是查不到记录,忘高手解答
     并说明一下,2歩和3歩的具体意思,真正解决的放 300分!!
      

  7.   

    又仔细看了一遍文档,发现可能是 词法分析器 这里有问题,它有8个基本对象,文档说默认是英文,我后来进入 Oracle Text Manager 里,语言制定器替换为 CHINESE_LEXER,可是还是没有效果怎么就我俩在说哦,还有没有搞过这方面的朋友帮帮忙!
      

  8.   

    sorry,没时间研究
    参考官方文档:
    http://download-west.oracle.com/docs/cd/B10501_01/text.920/a96518/toc.htm
      

  9.   

    it-pub 第四期杂志~  第一篇~  玉面飞龙兄在里头讲得很详细~
    http://www.itpub.net/magazine/itpub200304.rar
      

  10.   

    回复人: chanet(牧师) ( ) 信誉:121  2004-09-18 13:56:00  得分: 0  
     
     
       it-pub 第四期杂志~  第一篇~  玉面飞龙兄在里头讲得很详细~
    http://www.itpub.net/magazine/itpub200304.rar
      
     
    里面的兄弟和晚上搜索的那些基本一样,我看了一遍又按着做了,可是就是不支持中文!搞S我了,为什么呢,是不是让我放弃啊!!还有楼上楼上兄弟,你提供的网我进不去!!
      

  11.   

    在顶一下,我只是不支持中文,步骤都对,我想可能就是少配了一个什么,差了哪个步骤,或者还是需要在服务器上做什么,你们提供的文档我都看了,没有找到答案,说的步骤方法跟我做的一样,怎么Oracle全文索引这么麻烦,我打算放弃了,问不出什么了,或者大家做全文索引的时候除了Index_Server 还用什么全文索引!
      

  12.   

    已经 call 玉面飞龙兄 进来了~  希望他可以帮助你~ :)
      

  13.   

    Oracle实现全文检索,其机制其实很简单。即通过Oracle专利的词法分析器(lexer),将文章中所有的表意单元(Oracle 称为 term) 找出来,记录在一组 以dr$开头的表中,同时记下该term出现的位置、次数、hash 值等信息。检索时,Oracle 从这组表中查找相应的term,并计算其出现频率,根据某个算法来计算每个文档的得分(score),即所谓的‘匹配率’。而lexer则是该机制的核心,它决定了全文检索的效率。Oracle 针对不同的语言提供了不
    同的 lexer, 而我们通常能用到其中的三个: basic_lexer: 针对英语。它能根据空格和标点来将英语单词从句子中分离,还能自动将一些出现频率过高已经失去检索意义的单词作为‘垃圾’处理,如if , is 等,具有较高的处理效率。但该lexer应用于汉语则有很多问题,由于它只认空格和标点,而汉语的一句话中通常不会有空格,因此,它会把整句话作为一个term,事实上失去检索能力。以‘中国人民站起来了’这句话为例,basic_lexer 分析的结果只有一个term ,就是‘中国人民站起来了’。此时若检索‘中国’,将检索不到内容。 
    chinese_vgram_lexer: 专门的汉语分析器,支持所有汉字字符集。该分析器按字为单元来分析汉语句子。‘中国人民站起来了’这句话,会被它分析成如下几个term: ‘中’,‘中国’,‘国人’,‘人民’,‘民站’,‘站起’,起来’,‘来了’,‘了’。可以看出,这种分析方法,实现算法很简单,并且能实现‘一网打尽’,但效率则是差强人意。 
    chinese_lexer: 这是一个新的汉语分析器,只支持utf8字符集。上面已经看到,chinese vgram lexer这个分析器由于不认识常用的汉语词汇,因此分析的单元非常机械,像上面的‘民站’,‘站起’在汉语中根本不会单独出现,因此这种term是没有意义的,反而影响效率。chinese_lexer的最大改进就是该分析器 能认识大部分常用汉语词汇,因此能更有效率地分析句子,像以上两个愚蠢的单元将不会再出现,极大 提高了效率。但是它只支持 utf8, 如果你的数据库是zhs16gbk字符集,则只能使用笨笨的那个Chinese vgram lexer. 
     
    如果不做任何设置,Oracle 缺省使用basic_lexer这个分析器。要指定使用哪一个lexer, 可
    以这样操作: 
    第一. 在ctxsys用户下建立一个preference: 
    Begin
     ctx_ddl.create_preference('my_lexer','chinese_vgram_lexer'); end;
    第二. 在建立intermedia索引时,指明所用的lexer: 
    create index myindex on mytable(mycolumn) indextype is ctxsys.context  
    parameters('lexer my_lexer'); 
    这样建立的全文检索索引,就会使用chinese_vgram_lexer作为分析器。 
    如果还不行,你还是把你具体的步骤都贴上来吧ORACLE TEXT的性能不如 TRS等国产中文检索性能要好;而且很占空间。索引一般会在数据的1到4倍之间;而且建立索引的时候需要的临时表空间也和索引大小一样
      

  14.   

    不行,还是不行,我贴我的步骤吧,我当前链接数据库的帐号是 User05,以后我都在这个帐户下进行操作的.
    权限已经由SYSTEM搜给了!
    登陆Pl/Sql Developer
    1>建索引项(对吧)
    SQL> begin
      2    ctx_ddl.create_preference('mylex','BASIC_LEXER');
      3    ctx_ddl.set_attribute('mylex','printjoins','_-');
      4    ctx_ddl.create_preference('mywordlist', 'BASIC_WORDLIST');
      5    ctx_ddl.set_attribute('mywordlist','PREFIX_INDEX','TRUE');
      6    ctx_ddl.set_attribute('mywordlist','PREFIX_MIN_LENGTH',1);
      7    ctx_ddl.set_attribute('mywordlist','PREFIX_MAX_LENGTH', 5);
      8    ctx_ddl.set_attribute('mywordlist','SUBSTRING_INDEX', 'YES');
      9  end;
     10  /PL/SQL procedure successfully completed2>建preference: ---------------------------------------
    SQL> begin
      2    ctx_ddl.create_preference('cnlex','CHINESE_VGRAM_LEXER');
      3  end;
      4  /PL/SQL procedure successfully completed
    3>建索引!---------------------------------------
    SQL> create index i_info_content on info_content(content) indextype is ctxsys.context  parameters('lexer cnlex');Index createdSQL> commit;Commit completeSQL>  Select * From info_content where CONTAINS (Content, '港澳旅游',1) > 0;   INFO_ID CONTENT
    ---------- -------结果没有数据,我哪步错了呢!
      

  15.   

    发现一个问题:          我进入Oralce Text Manager 里,发现在 CTXSYS 用户下LEXER类别中
              
          没有           CHINESE_LEXER
              CHINESE_VGRAM_LEXER      只有一个
              BASIC_LEXER
              DEFAULT_LEXER
     
    而另外一个用户有 
              WK_CHINESE_LEXER
    而我在当前用户下 USER05下执行
     begin
      ctx_ddl.create_preference('cnlex','CHINESE_LEXER');
     end; 却没有错误!!
    是不是我的框架对象'CHINESE_LEXER' 没有啊,在 管理器中我看不到?可是为什么又不出错呢?是不是问题就在这里啊,请 biti_yumianfeilong(玉面飞龙) 帮忙!! 刚在GOOGLE搜索你的名字一下,荣幸!
      

  16.   


    Oralce Text Manager >数据库>首选项 右边的列表中
      没有
              CHINESE_LEXER
              CHINESE_VGRAM_LEXER
      

  17.   

    哦,我在管理器首选项那,以 USER05登陆以后 类似创建,下拉列表里是有 CHINESE_LEXER 的
      

  18.   

    在CTXSYS下建立 preference 也不好使,气馁了!!
    期待
    玉面飞龙
    的在一次出现!!
      

  19.   

    再次去 call 玉面飞龙 进来~...
      

  20.   

    再次 谢谢 chanet(牧师) ,客气话不说,到时候大放分!
      

  21.   

    PDF里面的问题都说的很清楚了context  类型的全文索引 用于对含有大量连续文本数据进行检索。支持word,html,xml,text等很多数据格式。支持中文字符集,支持分区索引,唯一支持并行创建索引(Parallel indexing)的索引类型。注意:但是对表进行DML操作后,并不会自动同步索引。需要手工同步索引
    SQL> create table info_content(content varchar2(4000));表已创建。SQL> insert into info_content values('中国人民共和国');已创建 1 行。SQL> commit;提交完成。
    SQL> create index i_info_content2 on info_content(content) indextype is ctxsys.
    ontext  parameters('lexer cnlex');索引已创建。SQL> Select * From info_content where CONTAINS (Content, '中国',1) > 0;CONTENT
    -------------------------------------------------------------------------------中国人民共和国SQL> insert into info_content values('索引需要同步,否则无法看见新增的文本');已创建 1 行。SQL> commit;提交完成。SQL> Select * From info_content where CONTAINS (Content, '同步',1) > 0;未选定行SQL>  begin
      2   ctx_ddl.sync_index('i_info_content2', '2M');
      3  end;
      4  /PL/SQL 过程已成功完成。SQL> Select * From info_content where CONTAINS (Content, '同步',1) > 0;CONTENT
    -------------------------------------------------------------------------------索引需要同步,否则无法看见新增的文本SQL>
    看是否为同步的问题
      

  22.   

    很感谢 玉面飞龙 兄的再次光临~ 呵呵...
    他是 itpub.net 和 cnoug.org 上的知名版主~   
    楼主还有不明白的话,可以直接找他~ :)
      

  23.   

    我抛弃了以前的表,按 玉面飞龙 兄 做的做了一遍,太兴奋了,终于可以SELECT出数据了,可是我同样方法,在已经存在的表上建索引,就不行!我的数据是通过 HTMLEDIT 编辑器,录入的!我在ITPUT论坛上找到一个会员说的话!!---------------------------2.我的数据库的字符集是16GBK
    问题是这样解决的
    通过查看ctxsys.ctx_parameters发现其中的default_filter_file和default_filter_binary都是inso_filter,所以要修改
    execute ctxsys.ctx_adm('default_filter_file','null_filter');
    execute ctxsys.ctx_adm('default_filter_binary','null_filter');-------
    他也是和我一样,不能找到中文,结果他自己这么解决了,我不知道上面步骤怎么走!!!
    http://www.itpub.net/showthread.php?s=&postid=1816335#post1816335
      

  24.   

    啊?我的Content 是 BLOB 类型的!!!!
      

  25.   

    和 ITPUT 论坛上这个兄弟的问题基本一样!!http://www.itpub.net/showthread.php?s=&postid=1816389#post1816389
      

  26.   

    在顶一下,玉面飞龙 兄,
    1>我的数据库的字符集是16GBK
    2>Content 字段类型是  BLOB 就是和这位仁兄  http://www.itpub.net/showthread.php?s=&postid=1816335#post1816335  的问题一样,我不知道他是怎么解决的?你的方法对VARCHAR2类型是可以的!
      

  27.   

    A> 我的数据库字符集是 16GBKB> 数据表字段Content 类型是 BLOB C>里面数据是通过在线编辑器,就象我们现在发贴这个编辑器录的数据.D>我是按 第四期 杂志上的文章做的,一歩也没有错,一路通过!F>问题就是 检索不出 中文数据 G>我在这里搜索以前帖子,找了和我问题一样的兄弟,但是他解决了.我不知道他怎么解决的,链接  http://www.itpub.net/showthread.php?s=&postid=1816335#post1816335
      

  28.   

    终于经过自己的摸索又有了进一歩的进展!通过查看 ctxsys.ctx_parameters我的 default_filter_file和default_filter_binary 还真都是inso_filter查看方法很容易,他是一个表,呵呵,痛苦啊,这还摸索了半天!修改方法,
    http://www.itpub.net/showthread.php?s=&postid=1816335#post1816335
    这个兄弟说,要执行execute ctxsys.ctx_adm('default_filter_file','null_filter');
    execute ctxsys.ctx_adm('default_filter_binary','null_filter');可是我直接执行,会提示错误!!1我直接修改数据表不可以吗??或者应该怎么做?错误提示ORA-06550: 第 1 行, 第 7 列: 
    PLS-00221: 'CTX_ADM' 不是过程或尚未定义
    ORA-06550: 第 1 行, 第 7 列: 
    PL/SQL: Statement ignored
      

  29.   

    在ITPUB论坛上我也发贴了,参与的还只是 玉面飞龙,问题还是没有解决,看来真要搁浅了,但是对于不是BLOG类型的数据是可以搜索中文的,我先整理归纳一下,一会发上来,供大家以后方便使用吧,呵呵,不过这个版的人气不高啊!!-----------整理先,这两天发上来,同时希望 玉面飞龙 兄能够在次伸出援助之手!现在进展到什么情况了呢建索引的时候 不管  Filter 指定 null_filter 还是 INSO_FILTER 都不支持对中文的索引当然字段类型是  BLOb 前提下
      

  30.   

    我在LINUX下面配置817的全文检索,索引的属性设置为FILE_DATASTORE时,I 表中的TOKEN_TEXT是乱码,一直找不到原因