WCC OracleTextSearch: DB-path SortSpec 오류와 OTS 재구성 실무 사례

WCC OracleTextSearch — SortSpec · OTS 재구성 사례 주제를 표현한 개념 그림
WCC OracleTextSearch: DB-path SortSpec 오류와 OTS 재구성 실무 사례

DB-path 정렬 오류 사례를 바탕으로 검색 경로, 인덱스 상태와 변경 전 확인할 조건을 정리합니다. 사례의 결과를 다른 환경의 보장으로 해석하지 마세요.

상황 개요

테스트 환경에서 OracleTextSearch(이하 OTS)를 사용하던 중, DB 복사 직후 검색 서비스에서 시간 초과와 정렬 오류가 보고되었습니다. 특히 OTS를 비활성화하고 DB-path로 검색을 수행할 때 일부 쿼리에서 정렬 지정 값(SortSpec)이 거절되어 결과가 반환되지 않았습니다. 반면 동일 조건에서 관리자 권한 계정(예: weblogic)은 정상 동작하고, 일반 사용자에게만 실패가 발생하는 패턴이 관찰되어 원인 분석이 필요했습니다.

증상과 로그 (주석 포함)

1) DB-path에서 SortSpec 거절

WCC 로그 (DB-path)
Caused By: intradoc.data.DataException: !csSearchInvalidOrderByClause,dDocTitle ASC
# 기록된 정렬 검증 오류입니다. 이 로그만으로 ORDER BY가 필수라고 판단할 수 없습니다.
WCC 로그 (DB-path, 별칭/역슬래시 포함)
Caused By: intradoc.data.DataException: !csSearchInvalidOrderByClause,xPublishDate DESC\, sddDocTitle ASC
# 역슬래시·필드 이름이 포함된 전달값입니다. 실제 파서·필드·커스텀 필터 대조가 필요합니다.

2) OTS 사용 시 시간 초과/확장 초과 의심

DB 에러 (Oracle Text)
ORA-01013: 사용자가 현재 작업의 취소를 요청했습니다
# 작업 취소를 알립니다. 실제 취소 주체·타임아웃 경로는 별도 확인합니다.

DRG-51030: wildcard query expansion resulted in too many terms
# 와일드카드로 확장된 검색어 수의 한도를 초과했습니다. 결과 행 수의 한도가 아닙니다.

원인 진단

이 사례에서는 DB-path 정렬 검증 오류와 OTS 오류를 따로 조사했습니다. csSearchInvalidOrderByClause만으로 모든 SortSpec에 SQL의 ORDER BY가 필요하다고 결론 내릴 수는 없습니다. WCC 12.2.1.4의 GET_SEARCH_RESULTS 문서는 정렬 필드와 방향을 나열하는 형식을 안내하므로, 실제 요청의 검색 엔진·버전·서비스·커스텀 필터를 확인해야 합니다. OTS에서는 DRG-51030의 와일드카드 확장 초과와 ORA-01013의 작업 취소를 구분합니다. DB 복사나 사용자별 보안 조건이 원인이었다는 판단에는 별도 로그와 재현 결과가 필요합니다.

조치 ①: DB-path의 SortSpec 교정

왼쪽은 생략된 QueryText가 있는 사례의 입력 발췌이며 실행 파일이 아닙니다. 오른쪽은 WCC 12.2.1.4 문서에 맞춘 별도 형식 예시로, SearchEngineName=database와 SQL 조건식, 필드·방향을 나열한 SortSpec을 사용합니다. OTS 검색식이나 과거 장애의 해결 증거로 해석하지 마세요. 설치 버전·지원 필드·커스텀 필터·사용자 권한을 확인한 테스트 환경에서만 검증합니다.

사례의 입력 발췌 · 실행 파일 아님
@Properties LocalData
IdcService=GET_SEARCH_RESULTS
UserTimeZone=UTC
QueryText=... (생략)
SortSpec=dDocTitle ASC
ResultCount=10
StartRow=1
@end
12.2.1.4 database 경로 형식 예시 · 미실행
@Properties LocalData
IdcService=GET_SEARCH_RESULTS
SearchEngineName=database
UserTimeZone=UTC
QueryText=dDocTitle like '%test%'
SortSpec=dDocTitle ASC dInDate DESC
ResultCount=10
StartRow=1
@end
결과: 동일 조건에서 서비스가 정상적으로 완료됨(고객 시험에서도 동일 결과 확인).

권장 운영 원칙

  • 서비스와 검색 엔진별 SortSpec 계약을 확인합니다. SQL의 ORDER BY 형식을 일괄 강제하지 않습니다.
  • 정렬 필드는 해당 경로가 지원하는 메타데이터 필드인지 확인합니다. 화면 라벨과 커스텀 DB 컬럼을 혼동하지 않습니다.
  • 역슬래시가 잘못 삽입됐는지 확인하되, 다른 쿼리 문맥에서 필요한 이스케이프까지 일괄 제거하지 않습니다.
  • 정렬 기본값이나 커스텀 필터 변경은 버전별 설정 위치와 영향 범위를 확인하고 제한된 테스트에서 검증합니다.

조치 ②: DB 복사 후 OTS 재구성

DB 복사 자체가 전체 재구축이나 두 인덱스의 일괄 변경을 요구하지는 않습니다. 먼저 WCC의 활성 컬렉션, DB 인덱스 상태와 오류를 대조해 복사 후 불일치가 있는지 판단합니다. 아래는 원문에 기록된 절차와 예시 이름이며 모든 환경에 적용할 실행 순서가 아닙니다. OracleTextSearch는 Oracle Database의 Oracle Text를 사용하는 검색 경로입니다. WCC·DB의 지원 조합과 라이선스, 메타데이터 검색과 전문 검색의 차이를 먼저 확인하세요.

1) Collection Rebuild 필요성 확인

WCC 12.2.1.4 문서는 Administration → Admin Applets → Repository Manager의 Indexer 탭에서 Collection Rebuild Cycle의 Start를 안내합니다. 재구축이 성공해야 새 컬렉션으로 교체됩니다. 검색 엔진을 변경했다면 해당 버전의 재시작·재구축 절차를 따르고, 복사 후라는 이유만으로 반복 실행하지 마세요. 부하·저장 공간·중단 및 복원 조건을 먼저 계획합니다. 파일의 전문 검색 가능 여부는 형식 매핑과 텍스트 추출 결과에 달려 있으며, 언어별 토큰화는 lexer 설정과 실제 검색으로 따로 검증합니다.

2) WORDLIST 속성 반영 (이름 변경 포함)

DOC_WORDLIST는 예시 이름이며 해당 preference가 올바른 스키마에 존재하고 활성 인덱스에 연결되어 있는지 먼저 확인해야 합니다. WILDCARD_MAXTERMS는 결과 행 수가 아니라 확장되는 검색어 수의 한도입니다. 25,000~50,000은 권장 시작값이 아닙니다. 설치 DB 버전의 허용 범위를 확인하고 검색식을 좁히는 방법과 메모리·지연 영향을 비교하세요. preference 변경만으로 기존 인덱스가 갱신됐다고 판단하지 마세요. 아래는 기존 preference 소유자와 필요한 권한을 확인한 후에만 검토할 변경 구문 예시입니다. SYS 접속이나 실제 실행을 권장하지 않습니다.

DB · preference 소유자·권한 확인 필요
BEGIN
  CTX_DDL.SET_ATTRIBUTE('DOC_WORDLIST', 'WILDCARD_MAXTERMS', '25000'); 
  -- 기존 preference에 대한 변경 예시입니다. 25000은 권장값이 아니며 버전·부하 검증이 필요합니다.
END;
/

3) 인덱스 변경 조건 검토 (예시 이름)

IDX_DOCTEXT_A, IDX_DOCTEXT_B, APP_SCHEMA는 익명화한 예시입니다. 아래 두 ALTER INDEX는 서로 다른 대상을 보여주는 구문 참고이며 일괄 실행 절차가 아닙니다. Oracle Text 19c는 REBUILD PARAMETERS('REPLACE WORDLIST ...') 형식을 지원하지만, 실제 인덱스 유형·분할 여부·소유자·preference와 변경 필요성을 확인해야 합니다. ONLINE은 Enterprise Edition에서 DML 지속을 지원하며 조회 지속을 보장하지 않습니다. wildcard 한도 같은 특정 속성 변경에는 재구축 대신 METADATA 변경이 가능한 경우도 있지만, 일관성과 잠금 영향을 검토해야 하므로 여기서 별도 대체 명령을 추가하지 않습니다.

DB (APP_SCHEMA)
-- 아래 A/B는 별개 예시입니다. 활성 인덱스를 확인하고 승인된 한 대상만 선택합니다.
-- 19c ONLINE은 DML 지속을 위한 옵션이며 조회 지속을 보장하지 않습니다(Enterprise Edition).
ALTER INDEX APP_SCHEMA.IDX_DOCTEXT_A 
  REBUILD ONLINE PARAMETERS('REPLACE WORDLIST DOC_WORDLIST');

ALTER INDEX APP_SCHEMA.IDX_DOCTEXT_B 
  REBUILD ONLINE PARAMETERS('REPLACE WORDLIST DOC_WORDLIST');

4) 적용 확인

Oracle Text 19c의 CTX_REPORT.DESCRIBE_INDEX는 CLOB을 반환하는 함수와 보고서 인수를 받는 프로시저를 모두 제공합니다. 아래 SQL 함수 형식 자체는 지원되지만, 인덱스 소유자로 접속한 상태에서 IDX_DOCTEXT_A처럼 스키마 접두사가 없는 이름을 전달해야 합니다. A/B의 실제 존재와 활성 상태는 별도 확인 대상입니다. 보고서 내용은 검색 결과·권한·성능 검증을 대신하지 않습니다.

DB (확인용)
SELECT CTX_REPORT.DESCRIBE_INDEX('IDX_DOCTEXT_A') FROM dual;
SELECT CTX_REPORT.DESCRIBE_INDEX('IDX_DOCTEXT_B') FROM dual;
-- 인덱스 소유자로 접속합니다. 이름 앞에 스키마를 붙이지 않습니다. 보고서는 검색·성능 검증을 대신하지 않습니다.

조치 ③: 관리자(webLogic) 정상·일반 사용자만 실패하는 경우

관리자와 일반 사용자의 결과가 다르면 최종 검색식, 권한 범위, 검색 엔진과 오류 시각을 먼저 비교합니다. 보안 조건의 차이가 실행 계획에 영향을 줄 수는 있지만, 그것만으로 와일드카드 확장량 증가나 특정 원인을 입증하지는 않습니다. 아래 항목은 진단 후보이며 일괄 적용 순서가 아닙니다.

  1. SDATA 적용 조건 확인
    WCC의 Optimized Field는 Oracle Text의 SDATA로 표현됩니다. dSecurityGroup은 문서상 기본 최적화 필드지만 dDocAccount까지 동일하다고 가정하지 마세요. 필드 유형·제한·재구축 필요 여부를 확인한 뒤 테스트하며, 보안 필터 성능이 반드시 개선되는 것은 아닙니다.
  2. 와일드카드와 실제 검색식 확인
    UI 입력과 Oracle Text에 전달된 검색식을 구분합니다. Oracle Text의 와일드카드는 %와 _이며 UI의 *term*을 그대로 DB 문법으로 해석하지 마세요. 검색어 확장 초과가 확인된 경우에만 검색식 축소 또는 버전에 맞는 한도 조정을 비교합니다.
  3. 취소 경로와 지연 확인
    ORA-01013은 작업 취소를 알리는 오류입니다. 사용자 취소·클라이언트 타임아웃 등 실제 취소 경로와 DB 대기 상태를 대조하고 제한값을 무조건 늘리지 마세요.
메모: 관리자 계정이 항상 모든 보안 필터를 우회한다고 가정하지 마세요. 실제 권한과 최종 쿼리, 실행 계획을 비교해야 사용자별 차이를 설명할 수 있습니다.

검증 결과와 운영 반영

먼저 DB-path 경로에서 스크립트의 SortSpec만 교정해 재시험한 결과, 서비스가 정상적으로 완료됨을 확인했습니다. 이후 동일한 정렬 형식을 WCC 설정에도 반영하여 화면 검색이 문제없이 수행되는 것을 재확인했고, 최종적으로 운영 환경에 동일 구성을 적용해 마무리했습니다. 당시 운영 반영을 설명한 원문 기록이며, 이번 검토에서 그 실행 결과를 새로 확인한 것은 아닙니다.

원문은 OTS 재구성을 테스트 환경에서 확인했다고 기록합니다. 이번 문서 검토는 당시 DB 버전·실행 기록이나 현재 인덱스 상태를 확인한 작업이 아닙니다. SDATA와 와일드카드 튜닝은 추가 검증 후보로 남깁니다. 관리자뿐 아니라 실제 사용자 권한으로 결과 정확성·지연·오류를 비교하기 전 개선 완료로 판단하지 마세요.

체크리스트

  • 정렬 오류는 검색 경로·서비스·버전별 형식과 실제 전달값을 대조한다.
  • DB 복사 후 불일치가 확인된 경우에만 컬렉션 재구축과 인덱스 변경 필요성을 검토한다.
  • 와일드카드 한도는 검색어 수 기준임을 확인하고 검색식·DB 버전·메모리 영향을 함께 검토한다.
  • 사용자별 최종 검색식과 권한 조건을 비교한 뒤 SDATA 등의 진단 후보를 검증한다.
  • 운영 반영 전 실제 사용자 권한으로 UI 검색의 결과·지연·오류와 복원 절차를 확인한다.

부록: 참고 스니펫

조건별 구문 참고 · 일괄 실행 금지
-- 기존 preference 변경 예시: 25000은 권장값이 아닙니다.
BEGIN
  CTX_DDL.SET_ATTRIBUTE('DOC_WORDLIST', 'WILDCARD_MAXTERMS', '25000');
END;
/

-- 아래 A/B는 별개 예시입니다. 활성 인덱스를 확인하고 승인된 한 대상만 선택합니다.
-- 19c ONLINE은 DML 지속을 위한 옵션이며 조회 지속을 보장하지 않습니다(Enterprise Edition).
ALTER INDEX APP_SCHEMA.IDX_DOCTEXT_A 
  REBUILD ONLINE PARAMETERS('REPLACE WORDLIST DOC_WORDLIST');

ALTER INDEX APP_SCHEMA.IDX_DOCTEXT_B 
  REBUILD ONLINE PARAMETERS('REPLACE WORDLIST DOC_WORDLIST');

-- 소유자로 접속한 상태에서 스키마 접두사 없이 보고서를 확인합니다.
SELECT CTX_REPORT.DESCRIBE_INDEX('IDX_DOCTEXT_A') FROM dual;
SELECT CTX_REPORT.DESCRIBE_INDEX('IDX_DOCTEXT_B') FROM dual;
12.2.1.4 database 검색 형식 예시
@Properties LocalData
IdcService=GET_SEARCH_RESULTS
SearchEngineName=database
UserTimeZone=UTC
QueryText=dDocTitle like '%test%'
SortSpec=dDocTitle ASC dInDate DESC
ResultCount=10
StartRow=1
@end
위로 스크롤