ctx_ddl.set_attribute('my_lexer', 'PRINTJOINS', '_-');
Oracle Text 란
Oracle Text는 Oracle 데이터베이스의 강력한 전문 검색 기능을 제공하는 도구입니다.
이는 대량의 텍스트 데이터를 효율적으로 처리하고 검색할 수 있게 해주는 기능으로써
텍스트 데이터에 대한 복잡한 쿼리를 빠르고 정확하게 수행할 수 있습니다.
Oracle Text를 사용하면, 문서, 이메일, XML 파일 등 다양한 형식의 데이터에 저장된 정보를 쉽게 찾아낼 수 있습니다.
말로는 잘 이해가 안되니
제가 실무에 적용한 상품검색을 예제로 들어보겠습니다.
상품데이터 등록
위 사진을 참조해주시구요
저희는 관리자페이지에서 상품데이터가 등록 될 경우
검색필드에 여러데이터가 조합되서 저장이 됩니다.
아주 긴 텍스트죠
저 데이터를 꺼내 쓸려면 성능이 많이 떨어집니다.
이런경우에 Oracle Text를 사용합니다
Oracle Text 사용 전 사전작업
1. CTXAPP 스키마 사용권한이 필요합니다
CONTEXT 인덱스 유형을 사용하기 위해서 아래처럼 권한을 줍시다.
GRANT CTXAPP TO 사용자명;
2. LEXER 및 속성 생성
BEGIN
ctx_ddl.create_preference('product_lexer', 'BASIC_LEXER');
END;
product_lexer라는 이름으로 BASIC_LEXER 유형의 LEXER(문자 분석기)를 생성합니다.
BASIC_LEXER는 텍스트를 토큰(검색 가능한 단어 단위)으로 분해하는 기본 문자 분석기입니다.
BEGIN
ctx_ddl.set_attribute('product_lexer', 'PRINTJOINS', '-&^');
END;
PRINTJOINS 속성은 특정 문자를 단어의 일부로 인식하도록 설정합니다.
여기서는 밑줄(_)과 대시(-)가 단어 구성 요소로 취급되도록 설정하고 있습니다.
예를 들어 high-tech가 하나의 검색어로 처리되게 하는 설정이라고 보면 됩니다.
3. 텍스트 색인 생성
CREATE INDEX prod_text_idx ON PRODUCTS(PTECHDESCRIPTION)
INDEXTYPE IS ctxsys.context
PARAMETERS ('LEXER product_lexer');
테이블에 생성한 LEXER를 연결해줍시다.
설정완료 후
자 그러면 Oracle Text 설정을 완료했는데 어떤쿼리가 가능해지느냐?
사용자가 "차렵 이불" 이라고 검색 했다고 칩시다.
아래의 쿼리가 가능해집니다.
SELECT p.PREFITEM, p.PNAME, p.PTECHDESCRIPTION, SCORE(1) AS RelevanceScore
FROM PRODUCTS p
WHERE CONTAINS(p.PTECHDESCRIPTION, '차렵 AND 이불', 1) > 0
AND p.ISUSE = 'Y'
ORDER BY SCORE(1) DESC;
위 결과물 처럼
상품검색 컬럼에 "차렵"과 "이불" 키워드를 둘다 가지고 있는 데이터가
빠르게 조회가능하게됩니다.
SCORE는 결과의 관련성, 연관성에 대한 점수입니다.
여기까지가 이 글의 범위이고, 막 여러가지 접목할 수 있는게 떠오르지 않나요?
데이터 전처리
그러면 사용자가 입력한 차렵 이불을
어떻게 차렵과 이불을 백엔드쪽에서 어떻게 쪼개주냐?
Apache Lucene이라는 녀석을 사용하여
텍스트를 분석하고 전처리를 하면됩니다.
다음에 관련 글을 써보도록 할게요
'DB' 카테고리의 다른 글
Oracle DB 관리자 필수 가이드: 기본 쿼리로 데이터베이스 리소스 정보 확인하기 (0) | 2024.05.22 |
---|---|
[MYSQL 쿼리튜닝] 파티셔닝 (1) | 2024.01.06 |
[MYSQL 쿼리튜닝] 커버링 인덱스 (2) | 2023.11.23 |
[MYSQL 쿼리튜닝] UNION vs UNION ALL (2) | 2023.11.22 |