日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ORACLE TEXT LEXER PREFERENCE(二)

發(fā)布時間:2024/8/26 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ORACLE TEXT LEXER PREFERENCE(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

介紹完Oracle全文索引的BASIC_LEXER屬性,這篇介紹Oracle中文語法屬性CHINESE_LEXER和CHINESE_VGRAM_LEXER。


Oracle全文索引的BASIC屬性主要是針對西方英語語系,英語語系的單詞是通過空格、標點和回車來分隔的。而中文則需要索引來自動切詞。

看下面這個例子:

SQL> CREATE TABLE T (ID NUMBER, DOCS VARCHAR2(1000));

表已創(chuàng)建。

SQL> INSERT INTO T VALUES (1, '一個中文例子,測試BASIC_LEXER語法屬性是否可以正常識別中文。');

已創(chuàng)建?1 行。

SQL> COMMIT;

提交完成。

SQL> CREATE INDEX IND_T_DOCS ON T (DOCS) INDEXTYPE IS CTXSYS.CONTEXT;

索引已創(chuàng)建。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '中文') > 0;

未選定行

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '一個中文例子') > 0;

ID DOCS
---------- ------------------------------------------------------------
1 一個中文例子,測試BASIC_LEXER語法屬性是否可以正常識別中文。

通過BASIC_LEXER來索引中文,Oracle只識別被空格、標點和回車符分隔出來的部分。需要對中文內(nèi)容進行索引的話,就必須使用中文的LEXER。

Oracle提供了兩種預(yù)定義的中文LEXER屬性:CHINESE_VGRAM_LEXER和CHINESE_LEXER。Oracle在文檔上是這樣描述的:

CHINESE_LEXER相對應(yīng)CHINESE_VGRAM_LEXER屬性有如下的優(yōu)點:

產(chǎn)生的索引更小;

更好的查詢響應(yīng)時間;

產(chǎn)生更接近真實的索引切詞,使得查詢精度更高;

支持停用詞。

雖然Oracle說明了使用CHINESE_LEXER的大量好處,但是CHINESE_LEXER的實際效果卻存在一定的問題:

SQL> DROP INDEX IND_T_DOCS;

索引已丟棄。

SQL> TRUNCATE TABLE T;

表已截掉。

SQL> INSERT INTO T VALUES (1, '北京大學未名湖');

已創(chuàng)建?1 行。

SQL> INSERT INTO T VALUES (2, '北京郵電大學');

已創(chuàng)建?1 行。

SQL> INSERT INTO T VALUES (3, '北京市第十四中學');

已創(chuàng)建?1 行。

SQL> COMMIT;

提交完成。

SQL> CONN CTXSYS/CTXSYS@YANGTK
已連接。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_VGRAM_LEXER', 'CHINESE_VGRAM_LEXER');
3 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE_LEXER', 'CHINESE_LEXER');
4 END;
5 /

PL/SQL 過程已成功完成。

SQL> CONN YANGTK/YANGTK@YANGTK
已連接。
SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER CTXSYS.TEST_CHINESE_VGRAM_LEXER');

索引已創(chuàng)建。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '北京') > 0;

ID DOCS
---------- ------------------------------------------------------------
3 北京市第十四中學
2 北京郵電大學
1 北京大學未名湖

SQL> DROP INDEX IND_T_DOCS;

索引已丟棄。

SQL> CREATE INDEX IND_T_DOCS ON T(DOCS) INDEXTYPE IS CTXSYS.CONTEXT
2 PARAMETERS ('LEXER CTXSYS.TEST_CHINESE_LEXER');

索引已創(chuàng)建。

SQL> SELECT * FROM T WHERE CONTAINS(DOCS, '北京') > 0;

ID DOCS
---------- ------------------------------------------------------------
2 北京郵電大學

通過對比結(jié)果可以發(fā)現(xiàn):使用CHINESE_LEXER沒有將第一條記錄和第三條記錄中的北京檢索出來。也許Oracle的CHINESE_LEXER認為北京大學和北京市是一個完整的詞匯,而沒有對其進行進一步切分。也許這就是Oracle提到的這種切分方式更接近于真實的情況。我不知道讀者會怎樣看待這個問題,不過我更傾向于使用CHINESE_VGRAM_LEXER,個人感覺返回記錄多一些總比漏掉一些要好。

總結(jié)

以上是生活随笔為你收集整理的ORACLE TEXT LEXER PREFERENCE(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。