2016-11-29 5 views
4

Oracle DB에 문제가 있습니다. 도메인 색인은 구체화 된보기에서 CONTAINS()를 사용하여 검색 한 후 0 행을 반환합니다. 구체화 된 뷰가 데이터로 채워져 있고 도메인 인덱스 동기화를 위해 프로 시저 ctx_ddl.sync_index()를 사용했습니다. 좋은 작품은 무엇구체화 된보기의 도메인 색인이 0 행을 반환합니다.

:에 의해

  • TABLE CREATE
  • 데이터 삽입
  • DOMAIN 인덱스를 만들
  • SYNC 도메인 INDEX
  • FIND 행에 포함 된 - RETURN 행

무엇 작동하지 않습니다 : TABLE CREATE

  • 데이터 삽입
  • 보기 MATERIALIZED CREATE
  • REFRESH는 MATERIALIZED VIEW
  • SYNC DOMAIN 지수가보기 구체화
  • DOMAIN INDEX IN이보기 MATERIALIZED CREATE
  • 물질 대사가 포함 된 내용 찾기 - 반올림 0 초 (LIKE % TERM % WORKS)

왜 구체화 된보기없이 모든 것이 잘 작동합니까? 가 여기 내 쿼리입니다 (당신은 복사 - 붙여 넣기와 오라클 DB에 그것을 시도 할 수 있습니다) :

--create table CREATE TABLE "PCOUNTERPARTY" ("ID_COUNTERPARTY" NUMBER(10,0), "TXT_SEARCH_FULL_NAME" NVARCHAR2(260), CONSTRAINT "PCOUNTERPARTY_PK" PRIMARY KEY ("ID_COUNTERPARTY"));

--INSERT DATA. Insert into PCOUNTERPARTY (ID_COUNTERPARTY,TXT_SEARCH_FULL_NAME) values (1184,'MARTINKO3');

--create materialized view CREATE MATERIALIZED VIEW m_pcounterparty AS SELECT c.ID_COUNTERPARTY, CAST(c.TXT_SEARCH_FULL_NAME AS varchar2(260 CHAR)) as txt_search_full_name_all FROM PCOUNTERPARTY c;

--create domain index create index IDXM_1_pcounterparty on m_pcounterparty(TXT_SEARCH_FULL_NAME_ALL) indextype is ctxsys.context PARAMETERS ('SYNC (ON COMMIT)');

--refresh of materialized view EXECUTE DBMS_MVIEW.REFRESH('M_PCOUNTERPARTY'); --refresh of index exec ctx_ddl.sync_index('IDXM_1_pcounterparty');

--search in materialized view SELECT TXT_SEARCH_FULL_NAME_ALL from M_PCOUNTERPARTY c WHERE CONTAINS(c.TXT_SEARCH_FULL_NAME_ALL, 'martin', 1) > 0; --return ZERO and THIS IS PROBLEM --c.TXT_SEARCH_FULL_NAME_ALL LIKE '%MARTIN%';-- return rows but we want search thru CONTAINS

답변

0

오라클 텍스트 인덱스는 일반적으로 단어가 아닌 문자열을 검색 할 수 있습니다.

"Martin Luther King Jr."에서 "martin"을 검색하는 데 와일드 카드가 필요하지 않습니다. 그러나 "MARTINKO3"에서 "martin"을 검색하려면 와일드 카드 이어야합니다.

CONTAINS(c.TXT_SEARCH_FULL_NAME_ALL, 'martin%', 1) > 0; 

내가 오라클 12.2에서 테스트를 실행하고 테이블이나 구체화 된 뷰를 사용하여 사이에 동작의 차이를 찾을 수 없습니다 :

이에 CONTAINS 조건을 변경

. 아마도 테스트 실수 또는 텍스트 색인이 시스템에서 다르게 작동하게하는 아주 특정한 버그가있었습니다.