티스토리 뷰
출처 : http://blog.naver.com/uook_/130111083653
(아직 이쁘게 글을 다듬은 상태는 아닙니다.
당연히 뜨거운 반응이 있지는 않을 것으로 생각되므로
언제 또 잘 다듬을 수 있을지는 미정이므로 일단 게시해 봅니다.)
검색창에서 자동완성 기능을 구현을 MS-SQL을 이용해서 구현해 본다.
http://blog.naver.com/uook_/130111081869
에 적어 둔 것처럼 함수를 만들고 (위의 함수는 2벌식 한글 자판을 기준으로 만들어졌다.)
자동완성의 대상(예: 책이름, 상품명 등)에 대해서
위의 함수를 이용해서 DB에 자동완성용 table을 생성한다.
CREATE TABLE auto_complt (
tgID INT -- 기본 data가 들어있는 테이블의 PK 등
, decom NVARCHAR(MAX)
, decomr NVARCHAR(MAX) -- 현재까지 입력된 검색어로 끝나는 자동완성을 위해
);
위의 테이블에 decom 컬럼에는 자소 분리가 된 문자열을 넣는다.
decomr 컬럼에는 REVERSE( decom ) 의 결과를 넣는다.
AJAX로 사용자의 'key up' event가 발생시 현재까지 검색창에 입력된 문자열을 @strSrchIn 이라하면
SELECT *
FROM baseTbl AS bt
INNER JOIN
auto_complt AS ac ON bt.srcID = ac.tgID
WHERE dcom LIKE dbo.uf_decom_syl_KS( @strSrchIn ) + '%'
위와 같은 select문으로 해당 검색어로 시작하는 data를 걸러낼 수 있다.
SELECT *
FROM baseTbl AS bt
INNER JOIN
auto_complt AS ac ON bt.srcID = ac.tgID
WHERE dcomr LIKE REVERSE( dbo.uf_decom_syl_KS( @strSrchIn ) )+ '%'
구현시 검토 사항(1) 자동완성의 대상에 해당하는 문자열을 하나도 안빼고 다 decom이나 decomr에 넣으면 인덱스의 키 값이 길어서 비효율적으로 동작할 수 있으므로 적당히 줄여서 넣어야 할 것이다.
구현시 검토 사항(2) 자동완성으로 보여줄 영역은 제한적인데(예를 들어 10개까지 보여주는) 대상이 되는 데이터는 그보다 많을 수 있다. 이때 어떤 것을 고를지에 대한 부분은 응용 분야에 따라서 매우 틀릴 수 있다. 쉽게 말해 모든 경우에 적용할 수 있는 명확한 기준을 제시할 수 있는 방법은 없다. 예를 들어 쇼핑몰의 경우 최근 한달간 많이 팔린 순으로 걸러내는 식의 어느 정도 heuristic한 판단이 필요하다.
구현시 검토 사항(3) 테이블을 따로 만드는 이유는 대상이 책제목, 출판사 등으로 여러 필드가 되는 경우 해당 사항을 추가적인 키필드 또는 테이블 구분필드 등을 추가하여 구현해야 하는 경우가 제가 겪어본 대부분의 경우였기 때문입니다. 물론 이러한 경우에는 select문을 잘 구성하여 join, union 등등으로 처리해야 겠습니다.
'program' 카테고리의 다른 글
[MySQL] DB 데이터 크기, 여유공간 확인 (0) | 2017.02.22 |
---|---|
[MS-SQL] 키 입력 기준 초,중,종성 분리 (0) | 2017.02.09 |
Auto-Suggest Control(검색어 자동완성) (0) | 2017.02.09 |
[jQuery] plugin(제이쿼리 플러그인)으로 검색 자동완성(autocomplete) 구현하기 (0) | 2017.02.09 |
[MySQL] 세로열을 가로열로 출력하기 (0) | 2017.02.03 |