zoukankan      html  css  js  c++  java
  • 全文索引--自己定义chinese_lexer词典

    本文来具体解释一下怎样自己定义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');
     


    看一下生成的词表。能够看到。是没有地质图这个keyword的。

    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:Usersfengjun>ctxlc -zht -ocs zhs16GBK> zhs16gbk_102.txt
     
    C:Usersfengjun>zhs16gbk_102.txt


    搜索了一下文档,里面没有找到地质图这个关键词


    最末尾加上地质图

    生成自己定义词典须要使用的三个以d、k、i结尾的文件

    这里总是出错

    C:Usersfengjun>ctxlc -zht -ics zhs16gbk -izhs16gbk_102.txt
    DRG-52107: ctxkbtc internal error
     
     
    加上-n參数,顺利生成
     
    C:Usersfengjun>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:Usersfengjun>dir dr*
     驱动器 C 中的卷是Windows8_OS
     卷的序列号是6C5D-2B1F
     
     C:Usersfengjun 的文件夹
     
    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_HOMEctxdatazhlx

    下的内容。而且将上面的几个文件copy到$ORACLE_HOMEctxdatazhlx下。而且改名

    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行。



    能够看到已经有地质图这个keyword了。

    这样自己定义词典就完毕了,对于大数据量的检索,自己定义词典还是很有意义的。

    以下是一个相关的简单測试

    未加关键词之前

    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

  • 相关阅读:
    [转]深入探析c# Socket
    [转]软件架构师书籍
    常指针类型讲解(const int *p,int*const p,int const *p,指针常量,常量指针)
    使用CreateFile()打开COM10及以上串口的问题[转并整理]
    如何在MFC中打开控制台[转]
    vb.net相关的除法运算
    计算机如何表示小数
    精简指令集与复杂指令集
    【转】ArcSDE数据被锁定后的解锁方法
    [ERR0134] Requested Service is not available【转载】
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7149624.html
Copyright © 2011-2022 走看看