1

データベース情報:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
"CORE   11.2.0.3.0  Production"
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

設定:

CREATE TABLE my_contains_test(    
   USERID VARCHAR2(8) NOT NULL,
   SEARCH VARCHAR2(40),
   CONSTRAINT contains_test_pk PRIMARY KEY (USERID)
);

INSERT ALL
INTO my_contains_test VALUES ('HUNTERW','Willie Hunter')
INTO my_contains_test VALUES ('HUWU','Will Hu')
SELECT * FROM dual;

create index ind_contains_test on my_contains_test(search) indextype is ctxsys.context;

クエリ:

select m.*, contains(search, 'will% and hu%', 1) as c_result from my_contains_test m;

結果:

    USERID   SEARCH         C_RESULT
    HUNTERW  Willie Hunter  4
    HUWU     Will Hu        0

それは 2 番目のレコード (C_RESULT == 0) の良い結果ですか? 何が起こっているのかわかりません。

ここに良い部分があります。WillietoBillieWillto Bill、query toのように、名前を別のものに変更します。

select m.*, contains(search, 'bill% and hu%', 1) as c_result from my_contains_test m;

そして結果は正しいです:

USERID  SEARCH          C_RESULT
HUNTERW Billie Hunter   4
HUWU    Bill Hu         4

したがって、1 つの位置を変更すると、動作が異なります。一体何のことだかさっぱりわからない。それを解決する方法についてのアイデアは素晴らしいでしょう。

4

1 に答える 1

1

単語willは英語の既定のストップ リストにあり、既定ではインデックスが作成されていません。
次のリンクを参照してください: http://docs.oracle.com/cd/B28359_01/text.111/b28304/astopsup.htm#CEGBGCDF

独自のストップ リストを作成し、それをインデックスで使用して、次のコードを試してください (ctx_dll に対する実行権限を付与している必要があります)。

drop index ind_contains_test;
exec CTX_DDL.CREATE_STOPLIST('my_empty_stoplist','BASIC_STOPLIST');
create index ind_contains_test on my_contains_test(search) 
indextype is ctxsys.context parameters('stoplist my_empty_stoplist');

select m.*, contains(search, 'will% and hu%', 1) as c_result 
from my_contains_test m;

USERID   SEARCH                                     C_RESULT
-------- ---------------------------------------- ----------
HUNTERW  Willie Hunter                                     4 
HUWU     Will Hu                                           4 
于 2013-08-16T21:39:32.657 に答える