Microsoft SQL Server 2005
2007. 4. 26.
안혁
http://hyok.kr

 일반적으로 게시판에 첨부파일을 추가할 경우, 이를 디스크의 특정 폴더안에 파일명이 겹치지 않도록 특별한 규칙을 적용하여 저장해둔 첨부파일에 대한 요청이 있을 시에 디스크에서 읽어내어 원래의 파일명으로 내려주는 형식을 취합니다. 아무래도 초창기에는 이외의 방법은 없었다고 보여지고, 이후에는 '그렇게 하면 된다'라는 방식의 기술 전수가 이루어져서 그런 것이 아닐까 생각해봅니다.
 
데이타베이스(이하 DB) 파일이 저장가능하게 된건 언제부터인지 모르겠으나, 덕분에 우리는 글을 저장하듯 파일도 DB 저장할 있는 것이지요. 하지만 그간 DB 파일을 저장하는 것은 매우 지양되던 방식이었습니다. 디스크에 파일을 저장하고 읽어내는 것과 비교했을때 매우 속도의 차이를 보였기 때문이지요. 아무래도 개발자의 편의성과 사용자를 위한 성능을 비교했을때, 후자쪽을 선택하는 것은 이전이나 지금이나 차이는 없는 같습니다.



 SQL Management Studio
실행한 개체탐색기(왼쪽 트리) 관리 하위를 보면 전체 텍스트 검색 찾을 있습니다. 마우스 오른쪽 버튼을 클릭하여 보면 시작, 중지, 다시 시작 등의 컨텍스트 메뉴를 확인할 있는데, 여기서 시작 회색(선택할 없다는 의미)이면 DB에서 전체 텍스트 검색 기능을 사용할 있다는 의미입니다. 그렇지 않다면 시작을 선택하여 주면 서비스를 사용할 것인지 확인하는 창이 뜨고 예를 누르면 서비스를 시작하는 창이 잠시 떳다가 사라집니다.



 
테이블을 마우스 오른쪽 버튼으로 클릭하게 되면 전체 텍스트 인덱스>전체 텍스트 인덱스 정의 메뉴를 확인할 있습니다. 파일이 저장되어 있는 테이블에서 해당 메뉴를 선택하면 다음과 같은 화면을 있습니다.





 
전체 텍스트 인덱스 정의하고자 하는 테이블에는 반드시 유일한 값을 가지는 컬럼이 존재하여야 합니다. 일반적으로 테이블에는 Primary Key 설정하므로 Primary Key 고유 인덱스 선택하면 됩니다.(Primary Key 또는 Unique 속성을 최소 하나의 컬럼에 적용한 테이블이어야 전체 텍스트 인덱스 정의가 가능합니다.)

 
다음으로 넘어가면 해당 테이블의 컬럼 목록을 확인할 있습니다. 창에서 어떤 컬럼을 검색 대상으로 것인지를 선택하게 됩니다. 우리가 하고자 하는 파일 검색은 저장된 파일의 확장자를 기록하고 있는 컬럼도 선택하여 주어야 합니다.

 

 
위의 그림에서 작업중인 테이블은 FileData(파일이 Image 타입으로 저장된 컬럼), FileType(파일의 확장자) 개의 컬럼으로 이루어져 있습니다. 전체 텍스트 검색 대상이 되는 FileData 컬럼을 체크했습니다. 그리고 추가적으로 FileType 컬럼을 FileData 유형 값으로 지정하였습니다. 이는 파일 검색에 있어서 대상이 되는 파일의 종류를 DB 있도록 해주는 것이며, 유형 기록되어 있는 확장자를 기준으로 필터가 지정되어 파일의 내용을 해석합니다. 그러므로 유형 열이 잘못 지정되거나, 파일 확장자가 잘못 저장되어 있다면 검색은 이루어지지 않게 됩니다. 저장되어 있는 파일의 정보를 읽어들여 파일 종류를 알아내는 것이 가능할 수도 있겠지만, 알고 있다면 알아내는 시간을 절약할 있게됩니다. 파일 검색은 비교적 일반 텍스트 검색과 비교하여 오래걸리므로 이런 방법이 필요하다 있겠습니다.
 
여기서는 검색 대상이 파일이기 때문에 유형 지정하지만, 만약 검색 대상이 Text 타입과 같은 문자열 컬럼이라면 DB 이를 처리할 있으므로 유형 지정할 필요가 없습니다. 유형 지정하는 이유는 해당 화일을 DB 이해할 없기 때문에 유형  통하여 하여 대신 읽어 필터를 지정하여야 하기 때문입니다. 그래서 지원되는 필터가 없다면 화일은 검색해낼 없는 것이 당연하지요. MS 오피스 문서, 텍스트 문서가 검색 대상이 된다고 있습니다.(HTML 문서는 검색에 문제가 있는 것으로 확인되었습니다)

 
기존 검색의 특징은 검색의 요청이 있을때에 검색 대상을 모두 일일이 확인하여 검색 조건에 만족하는 것이 있는지 찾는다는 것입니다. 검색 시간은 정보의 양에 비례한다고 있지요. 어떤 자료가 어디에 있는지는 알지 못하며, 단지 처음부터 끝까지 조사한다는 단순한 방식입니다. 무작성 섞여있는 카드에서 원하는 카드를 찾는 것보다는 순서대로 정리해놓은 카드에서 원하는 카드를 찾는 것이 훨씬 빠릅니다. 전체 텍스트 검색 이를 이용하는 것이며, 말은 찾기 전에 정리 단계가 필요하다는 말이기도 합니다.
 
전체 텍스트 검색이라는 기능을 사용하기 위하여 정리, 인덱싱 작업을 하여야만 합니다. 이로인하여 발생되는 문제는 검색 대상에 변화(자료의 추가, 삭제, 변경 ) 있을 경우 이를 정리-인덱싱해주지 않으면 검색은 올바로 이루어질 없게 됩니다. 저희 집에 전화를 설치했다고 해도 전화번호부에 이름이 추가되지 않으면 전화번호부에서 저를 찾을 없는 것과 같이 검색 대상에 변화가 있다면 이를 반영하기 전까지의 검색 결과는 실제 상태와 차이를 보일 있습니다
.



 
변경 내용 추적 선택 창에서 자동으로 설정하면 DB 직접 해당 테이블의 변경사항을 알아차려 인덱싱 되도록 도와줍니다. 관리자는 매번 인덱싱 해야하는 고민에서 벗어나 일을 DB 자동으로 하도록 설정할 있습니다. DB 인덱싱을 하게되면 하지 않을때보다는 CPU 사용하게 되므로 수동으로 하여 CPU자원이 충분할 때에 직접 인덱싱 하는 것이 더욱 효과적일 수도 있습니다. 인덱싱 주기가 길면 길수록 기능 사용의 목적을 달성하기 어려우므로 가장 적합환 선택을 하시기 바랍니다.



 
지금까지의 작업결과는 전체 텍스트 카탈로그 저장되게 됩니다. 원하는 방식으로 이름을 정하여 주시면 되며 다른 값은 기본값으로 두어도 무방합니다. 만약 카탈로그를 만드는 것이 처음이 아니라면 위쪽에 있는 전체 텍스트 카탈로그 선택에서 기존에 작성한 카탈로그를 선택할 있습니다.



 
체우기 테이블 내용이 바뀐 것에 대하여 인덱싱 작업이 이루어 지는 것을 말합니다. 특정 시간에 맞추어 테이블이나 카탈로그에 대하여 체우기가 실행되도록 설정할 있습니다.
 
다음을 누르면 최종적으로 이제까지의 설정을 확인할 있는 내용이 나오며, 확인을 클릭하면 전체 텍스트 인덱싱 정의 마무리되며, 바로 이어  전체 텍스트 인덱싱 생성 이루어집니다.


 
방금 만든 카탈로그는 다음과 같이 생성한 DB>저장>전체 텍스트 카탈로그에서 확인 가능합니다




 
설정이 이루어진 테이블 안에 넣어둔 파워포인트 파일를 검색해보겠습니다. 파일은 다음과 같은 2 문서로 구성되어 있으며, 검색이 되는 모습과 되지 않은 모습 모두 확인 있습니다.



 

 
위에서 보이는 글자 중에 '감사', 'Q/A' 두가지에 대하여 검색 해보겠습니다. 전체 텍스트 검색 CONTAINS 사용하며 다음과 같이 사용합니다.

      
SELECT * FROM dbo.tb_bo_AttachedFile
       
WHERE CONTAINS(FileData, '감사
');



 
위의 경우는 검색이 이루어진 경우이지만, 다음의 경우에는 3일만에 찾은 검색이 이루어지지 않는 경우 입니다
.

      
SELECT * FROM dbo.tb_bo_AttachedFile
      
WHERE CONTAINS(FileData, 'Q/A
');



 
전체 텍스트 검색 매우 강력한 기능이지만, 검색이 되지 않는 경우도 있음을 기억하셔야 합니다.

Posted by 안혁 windfruit

댓글을 달아 주세요