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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

ORACLE TEXT LEXER PREFERENCE(三)

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

本文繼續(xù)介紹Oracle全文索引的LEXER屬性,這篇文章介紹Oracle多語言全文索引MULTI_LEXER。


如果在Oracle中存儲多種語言,那么在建立全文索引的時候就不能只是簡單的指定一個LEXER,而是要通過LANGUAGE COLUMN設(shè)置MULTI_LEXER。

下面看一個簡單的例子:

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

表已創(chuàng)建。

SQL> INSERT INTO T VALUES (1, 'english', 'This is a mixed language example.');

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

SQL> INSERT INTO T VALUES (2, 'chinese', '中文信息應(yīng)該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引');

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

SQL> INSERT INTO T VALUES (3, 'chinese', '英文記錄雖然可以通過中文語言屬性CHINESE_VGRAM_LEXER繼續(xù)索引');

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

SQL> INSERT INTO T VALUES (4, '', 'But all the words is indexed by UPPER FORMAT.');

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

SQL> COMMIT;

提交完成。

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

索引已創(chuàng)建。

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

未選定行

如果使用BASIC_LEXER作為LEXER屬性的選項,那么就無法對中文使用索引。

SQL> DROP INDEX IND_T_DOCS;

索引已丟棄。

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

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_LEXER');

索引已創(chuàng)建。

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

ID LANGUAG DOCS
---------- ------- ----------------------------------------------------------
3 chinese 英文記錄雖然可以通過中文語言屬性CHINESE_VGRAM_LEXER繼續(xù)索引
2 chinese 中文信息應(yīng)該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引

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

ID LANGUAG DOCS
---------- ------- ---------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.

如果使用CHINESE_VGRAM_LEXER屬性的話,雖然可以對英文進行索引,但是中文LEXER無法進行屬性的設(shè)置,如果想要對英文進行大小寫敏感的查詢,使用CHINESE_VGRAM_LEXER屬性是不行的,必須使用BASIC_LEXER,并進行MIXED_CASE屬性設(shè)置。

SQL> DROP INDEX IND_T_DOCS;

索引已丟棄。

SQL> CONN CTXSYS/CTXSYS@YANGTK
已連接。
SQL> BEGIN
2 CTX_DDL.CREATE_PREFERENCE('TEST_ENGLISH', 'BASIC_LEXER');
3 CTX_DDL.SET_ATTRIBUTE('TEST_ENGLISH', 'MIXED_CASE', 'YES');
4 CTX_DDL.CREATE_PREFERENCE('TEST_CHINESE', 'CHINESE_LEXER');
5 CTX_DDL.CREATE_PREFERENCE('TEST_MULTI_LEXER', 'MULTI_LEXER');
6 CTX_DDL.ADD_SUB_LEXER('TEST_MULTI_LEXER', 'DEFAULT', 'TEST_ENGLISH');
7 CTX_DDL.ADD_SUB_LEXER('TEST_MULTI_LEXER', 'SIMPLIFIED CHINESE', 'TEST_CHINESE', 'CHINESE');
8 END;
9 /

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_MULTI_LEXER LANGUAGE COLUMN LANGUAGE');

索引已創(chuàng)建。

建立一個MULTI_LEXER屬性的索引,并通過LANGUAGE列設(shè)置需要索引的語言。Oracle會根據(jù)LANGUAGE列的內(nèi)容去匹配ADD_SUB_LEXER過程中指定的語言標識符。如果匹配的上,就使用該SUB_LEXER作為索引的LEXER,如果沒有找到匹配的,就使用DEFAULT語言作為索引的LEXER列。

上面雖然建立了MULTI_LEXER索引,但是對多語言索引的查詢卻還存在一些額外的問題:

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

ID LANGUAG DOCS
---------- ------- ----------------------------------------------------------
3 chinese 英文記錄雖然可以通過中文語言屬性CHINESE_VGRAM_LEXER繼續(xù)索引
2 chinese 中文信息應(yīng)該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引

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

未選定行

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

未選定行

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

ID LANGUAG DOCS
---------- ------- ------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.

通過上面的查詢結(jié)果可以推測出,BASIC_LEXER并沒有起作用。對于中文的查詢可以生效,但是對于字符大小寫敏感的查詢都不會生效。可以生效的查詢只是原文中就使用大寫的單詞。

這是由于當前客戶端的語言設(shè)置是簡體中文,這和索引中的一個SUB_LEXER相匹配,因此Oracle選擇了該LEXER的索引結(jié)果作為查詢的返回結(jié)果。下面將NLS_LANGUAGE設(shè)置為英文:

SQL> SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_LANGUAGE';

PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE

SQL> ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';

Session altered.

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

ID LANGUAG DOCS
---------- ------- -----------------------------------------------------------
3 chinese 英文記錄雖然可以通過中文語言屬性CHINESE_VGRAM_LEXER繼續(xù)索引
2 chinese 中文信息應(yīng)該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引

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

no rows selected

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

ID LANGUAG DOCS
---------- ------- --------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.

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

ID LANGUAG DOCS
---------- ------- --------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.

結(jié)果恢復(fù)了正常,如果將語言不設(shè)置為DEFAULT LEXER,而是設(shè)置索引包含的LEXER以外的語言,查詢也是正常的。

SQL> ALTER SESSION SET NLS_LANGUAGE = 'TRADITIONAL CHINESE';

Session altered.

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

ID LANGUAG DOCS
---------- ------- -----------------------------------------------------------
3 chinese 英文記錄雖然可以通過中文語言屬性CHINESE_VGRAM_LEXER繼續(xù)索引
2 chinese 中文信息應(yīng)該使用中文語言屬性CHINESE_VGRAM_LEXER進行索引

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

no rows selected

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

ID LANGUAG DOCS
---------- ------- -----------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.

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

ID LANGUAG DOCS
---------- ------- -----------------------------------------------------------
4 But all the words is indexed by UPPER FORMAT.

這就是說,對于包含多種語言的全文索引需要額外的小心。尤其是客戶端的語言設(shè)置與全文索引中的非DEFAULT屬性的SUB_LEXER的語言一致的情況。這個時候查詢語句會僅返回當前語言下的索引記錄。

總結(jié)

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

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