2014-03-28 8 views
1

Oracle 10g에서 Oracle Text를 사용하고 있습니다. 나는 다음과 같이 여러 열로 CONTEXT 인덱스를 만들었습니다Oracle Text Stemming이 작동하지 않는 이유는 무엇입니까?

내 테이블입니다

CREATE TABLE WEB_RES 
( 
    "ID" NUMBER(10,0), 
    "TITLE" VARCHAR2(256 BYTE), 
    "DESCRIPTION" VARCHAR2(1024 BYTE), 
    "CONTENT" BLOB, 
    "CATEGORY" VARCHAR2(64 BYTE), 
    ... 
    CONSTRAINT "PK_WEB_RES" PRIMARY KEY ("ID") 
} 

내 취향과 인덱스는 다음과 같습니다

:

execute ctx_ddl.create_preference('my_multi', 'MULTI_COLUMN_DATASTORE'); 
execute ctx_ddl.set_attribute('my_multi', 'columns', 'title, description, category'); 
execute ctx_ddl.create_preference('my_lexer', 'BASIC_LEXER'); 
execute ctx_ddl.set_attribute('my_lexer', 'index_stems', '1'); 

create index myTitleIndex on web_res(title) 
indextype is ctxsys.context 
parameters ('DATASTORE my_multi lexer my_lexer SYNC(ON COMMIT)'); 

나는 다음과 같은 내 테이블에 행이

ID   Title        Description  Category 
---  -----------       -------------- ------------ 
1  Superannuation Contributions Splitting  Test   Test 

영어가 제 모국어가 아니지만이 쿼리가 결과를 반환하지 않아야합니까?

SELECT * FROM web_res WHERE CONTAINS(title, '$contribute', 1) > 0; 

나는 '$ 기부하기'또는 '$ 승인'을 검색 할 때 '승인'으로 제목을 찾을 수를 검색 할 때 '공헌'로 제목을 찾을 것으로 기대합니다. 이것은 형태소 분석이 아닌가?

편집 : 나는 또한 아래로 Basic_Wordlist을 시도하지만, 여전히 다시 내 쿼리에 대한 행이 없어 :

execute ctx_ddl.create_preference('my_wordlist', 'BASIC_WORDLIST'); 
execute ctx_ddl.set_attribute('my_wordlist', 'stemmer', 'ENGLISH'); 

create index myTitleIndex on web_res(title) 
indextype is ctxsys.context 
parameters ('DATASTORE my_multi wordlist my_wordlist SYNC(ON COMMIT)'); 

답변

2

당신이 영어로 설정 형태소 분석기의 기본 설정에 대한 BASIC_WORDLIST를 만들려고하시기 바랍니다 수 있습니까?

execute ctxsys.ctx_ddl.create_preference('my_multi','MULTI_COLUMN_DATASTORE'); 
execute ctxsys.ctx_ddl.set_attribute('my_multi','columns','a,b,c'); 
execute ctxsys.ctx_ddl.create_preference('my_lexer','BASIC_LEXER'); 
execute ctxsys.ctx_ddl.set_attribute('my_lexer','index_stems','1'); 
execute ctxsys.ctx_ddl.create_preference('my_wordlist','BASIC_WORDLIST'); 
execute ctxsys.ctx_ddl.set_attribute('my_wordlist','stemmer','ENGLISH'); 

create index tt on test(a) indextype is ctxsys.context parameters('DATASTORE my_multi WORDLIST my_wordlist LEXER my_lexer SYNC(on commit)'); 

insert into test values ('Superannuation Contributions Splitting','test','test'); 
insert into test values ('commit','Superannuation Contributions Splitting','test'); 
insert into test values ('commit','test','Superannuation Contributions Splitting'); 
commit; 
: 나는 다음과 같은 스키마를 사용 ...

http://docs.oracle.com/cd/B19306_01/text.102/b14218/cdatadic.htm#i1008929


OK, 나는 당신을 위해 더 깊이를 연구 한, 그리고 당신이 그가 reuslts 좋아할 생각하지 않는다

그래서 스키마를 생성 한 후 DR $ INDEX_NAME $ I 테이블로 이동하여 데이터를 살펴 보았습니다. B, C, 커밋, 기여, 기여, 분할, 분할, 연금, 테스트가 포함되어 있습니다. 이것은 검색 할 수있는 "뿌리"의 목록임을 의미합니다.

"기여"는 여기에 없으므로 "도달 할 수 없습니다".

그러나 '$ contribution'을 (를) 검색하게되면 커밋의 루트가 목록에 있으므로 "$ contribution"을 찾거나 "$ committing"을 찾을 수도 있습니다.

결론 - 오라클은 기여와 기여가 관련이 있는지 알 수 없습니다. 이것은 엔진의 버그이거나 언어 적 속성입니다 (결코 알 수 없음).

하지만 - 나는 형태소 작품을 드릴 수 있습니다 - 지금 내가 사용할 수있는 오라클 기계가 없기 때문에 '$ 기여'와 '$ 분할'의 검색 (결과 ...

+0

를 반환하기 때문에 , 당신의 문제를 해결하지 못한다면 - 나는 내일 Oracle DB에서 모든 것을 재현해야 할 것입니다 ...) – evenro

+0

나는 이미 성공하지 않고 그것을 시도했습니다. 결과는 같습니다. 그것을 반영하기 위해 내 질문을 업데이트 할 것입니다. – shadi

+0

BASIC_LEXER에서도 시도해 보셨습니까? 실패 했습니까? 서버 구성 문제 등을 좁히고 싶습니다. – evenro