검색 후 복수 제외 단어에 대한 쿼리 질문입니다. 0 6 3,518

by 호야 [SQL Query] [2010.01.11 01:30:30]


오라클 클럽 회원, 형님(누님) & 동생님들 안녕하십니까
검색 후 관련 된 단어 제외에 대한 고찰을 하다가 도움을 받고자 올립니다.
아래 테이블에 [검색통합] 컬럼에는 상품이름+상품메이커+상품태크+상품광고명이 들어 갑니다.

상품 테이블

상품이름 상품메이커 상품 태그 상품광고명 검색통합
저렴한 9,990원 겨울신발 Ora 신발,운동화 신으면 날라당겨요 ............
겨울 옷이 멋져요! BingBang 옷, T, 잠바 올겨울 따뜻하게!! 겨울을... ..............
겨울 이번달 베스트 셀러 OracleClub 책, DB, SQL 멋진 커뮤니티 책 모임 ............
........... ........... .......... ........ ..........

5개의 컬럼이 존재 합니다.
자료는 10만개가 됩니다.
검색의 목적은 찾고자 하는 [단어]를 입력 후 제외 하고자 하는 단어를 복수로 입력하여,
관련 단어가 있으면 제외를 시켜 합니다.

검색의 첫번째 조건은
상품이름 + 상품메이커 + 상품 태그 + 상품광고명 컬럼 중
해당 검색어가 있는 것을 찾는 것 입니다.
(여기에 관련 된 해결은 CTX Domain Index를 [검색통합]에 걸어서  Contains 검색으로 하였습니다.
 다른 방법이 있으시다면 조언을 해 주시기 바랍니다)
=> 검색어 : 겨울

2번째 조건은
상위 "겨울"을 검색한 내용들 중에 "잠바,책,DB,모임" 이라는 단어가 있으면
목록에서 제외를 시켜야 되는 작업 입니다.
제외 단어가 적게는 0개에서 많게는 10개이상 나올수 있습니다.

이러한 제한이 걸린 검색을 할때 어떻게 해결 해야 될까요?


1번째 조건이미 발동되었다고 생각하고 생각해 보셔도 됩니다

WITH TBL_T AS
(SELECT '저렴한 9,990원 겨울신발 Ora 신발,운동화 신으면 날라당겨요 ............' total_word FROM dual UNION all
SELECT '겨울 옷이 멋져요! BingBang 옷, T, 잠바 올겨울 따뜻하게!! 겨울을... ..............' FROM dual  UNION all
SELECT '겨울 이번달 베스트 셀러 OracleClub 책, DB, SQL 멋진 커뮤니티 책 모임' FROM dual)


SELECT *
FROM TBL_T

조건은 =>  잠바,책,DB,모임       가 있으면 리스트에서 제외 되어야 합니다.



NOT Contains 는 해 봤지만 속도가 영 꽝이었습니다. 차라리 
NOT LIKE '%단어%'   를 LOOP를 돌리는게 빠를 정도 입니다.

여기서 생각해야 될것은 오라클의 SGA영역에 무리가 되지 않도록
 바인딩으로 인한 SOFT PARSE를 유도 하는 것입니다.

좋은 방안이 있다면, 조언 쩜 해주세요^ㅡ^;  새벽에 뻘짓하는 호야 올림

by 현 [2010.01.11 09:20:07]
일단 첫번째 검색에서,
검색되는 항목을 제한하거나 특정 할 순 없나요?
즉, 검색을 시작할 때 상품이름인지, 메이커인지, 태그인지 특정 해 놓으면 좀더 수월할 듯 합니다.


by 현 [2010.01.11 09:23:08]
'%단어%' 이렇게 검색하면 인덱스 스캔을 하긴 하나 효율은 떨어지겠죠.

개인적인 생각으로는 이런 경우엔 가급적 협의를 통하여 어떤 컬럼 한두개라도 단어%로 만들 수 있도록 노력을 합니다.
그래도 씨알이 안먹히는 경우엔 상황을 보여줍니다.
현업들은 잘 모르지만 IT 관련자들은 full scan만 뜨면 무지 놀랍니다.
그걸 잘 이용하는 거죠...

앞서 말씀드린 검색조건에 대한 컬럼을 특정 하는 것도 비슷한 유형이라 생각됩니다.
고객의 요구사항에 만족을 시켜주는 것이 우리가 해야할 일 이긴 하지만,
보다 효과적으로 할 수 있는 방법이 있다면 그 길을 알려주는 것도 우리가 해야 할 일 중 하나라 생각합니다.

by 현 [2010.01.11 09:24:16]
이렇게 해서 첫번째 원하는 것이 적은 껀수로 빠르게 나왔다면
그 결과 집합에 대해서 not like 하는 것은 그리 오래 걸릴 꺼 같지는 않습니다.

일단 말빨을 많이 세우시길 기대해 봅니다.

by 호야 [2010.01.11 11:37:52]
첫번째 검색은 통합 검색이라서 모든 컬럼에 경우의 수를 다 두어야 합니다.
한 단어의 검색을 통해서 모든 컬럼에 대한 정보 조회가 이루어 져야 합니다.
그리고 NOT LIKE가 들어 갈시에는
AND NOT LIKE '% 잠바%'
AND NOT LIKE '% 책%'
AND NOT LIKE '%DB%'
AND NOT LIKE '%모임%'
이런씩의 모양이 되게 됩니다.
갯수 바뀐다면 그 만큼 동적으로 만들어 주겠죠.
그렇게 되면 갯수에 따른 바인딩에 대한 고려와 내부 값에 대한 바인딩이
문제가 되겠죠.

by 설렘 [2010.01.11 18:13:46]
이건 안될까요? 자신이 없네요.

WITH TBL_T AS (
SELECT '저렴한 9,990원 겨울신발 Ora 신발,운동화 신으면 날라당겨요 ............' total_word FROM dual UNION all
SELECT '겨울 옷이 멋져요! BingBang 옷, T, 잠바 올겨울 따뜻하게!! 겨울을... ..............' FROM dual UNION all
SELECT '겨울 이번달 베스트 셀러 OracleClub 책, DB, SQL 멋진 커뮤니티 책 모임' FROM dual
)
SELECT *
FROM TBL_T a
where total_word like '%겨울%'
and not exists (
select *
from TBL_T b
where (total_word like '%잠바%'
or total_word like '%책%' or total_word like '%모임%')
and a.total_word = b.total_word
)

by 호야 [2010.01.12 11:55:36]
전.. not like 에 들어 오는 문자가 고정이라고 하지 않았습니다.
인자가

'잠바,책,DB,모임'
들어 올수 도 있고
'잠바,책,DB'
들어 올수도 있고
'잠바,책,DB,Oracle,Club,Web,나라,한국........'
적게는 몇개에서 많게는 몇십개가 될수도 있습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입