속담/명언/연설등을 검색하는 부분을 구현하는데 검색된 컬럼은 약 1~3KB 정도 되는 text 타입입니다.
레코드는 30만개가량되고요.
처음에는 그냥 LIKE "%검색어%" 식으로 하였는데 데이타 양이 늘어나면서 점점 늦어지더라고요.
Q6600 , 4GB , SCSI 시스템에서 십여초가 넘어갈때가 있는데
그것보다 이게 여러곳에서 요청이 누적되면 쿼리를 끝내지못하고 계속 자원만잡아먹고 서버가 맛이갑니다.
일단 서버튜닝은 튜닝대로 하고있는중인데 근본적인 LIKE 검색을 바꿔보려고 연구중입니다.
웹검색엔진에 많이 사용되는 형태소분리한후 역인덱싱하는 방법도 사용해봤는데 이게 원하는결과가 정확히 안나오네요.
예를 들어
"너그럽고 상냥한 태도, 그리고 사랑을 지닌 마음, 이것이 사람의 외모를 아름답게 하는 말할 수 없이 큰 힘 인 것이다."
라는 문구를 찾기위하여
"말할 수 없이 큰 힘 인 것이다."
라는 검색어로 검색을 합니다.
이건 형태소 파싱해서 넣을때도 애매하고 입력되는 검색어도 뛰어쓰기등으로 에메해지더라고요.
억지로 "말할" "없이" "큰" "힘" "것이다" 등으로 파싱했다 하더라도 어순에 따른 문제로
"큰힘 없이 말할 수 없다" 등과 같이 전혀 다른 문구가 검색되버립니다.
물론 속도는 형태소로 파싱되어 입려된 테이블에(약 500만컬럼) IN('검색어','검색어','검색어') 식으로 해도 비교할 수 없을정도로 빠르지만요.
질문 1.
100 말할
100 없이
100 큰
100 힘
100 것이다
위와 같이 역인덱싱을 했을때 있을때 단어순서에 따른 역인덱싱은 보통 어떻게 하나요?
단어배열을 고려 하지 않는다면 하나의 레코드가 많은 데이타를 갖고있고
그중 중요 키워드로만 검색하는 (ex, 웹페이지) 경우가 아니라면 별 의미가 없지 않을까 싶은데요.
질문2.
아무리 생각해도 제상황에는 중요도위주의 역인덱싱이 아닌 "토씨" 위주의 바이트검색을 하는게 맞는것 같은데
최소한 LIKE 문을 쓰지 않고 검색할 수 있는 방법은 없을까요? 최소한 LIKE "검색어%" 정도의 퍼포먼스라도
뛰어쓰기는 뛰어쓰기를 모두 제거한 검색전용 필드를 역정규화로 만들어서 사용한다고 해도
중간부터 나오는 단어를 검색어로 넣었을때는 답이 없더라고요.
저와 같은 상황에서 가장 좋은 검색방법에 대해서 조언부탁드립니다.
DB는 MySQL 5.1 을 사용하고있습니다.
|