전문 검색 소프트웨어 만들기 이야기
이마
PDF, Excel, Word, PowerPoint 등의 내용이 포함된 파일을 포함한 키워드 검색 소프트웨어'탐삼랑를 개발해 공개했다.여기서 전문 검색 소프트웨어를 제작할 때의 구조, 알고리즘과 샘플 원본을 소개하고 싶습니다.
최근 몇 년 동안 모든 자료, 문서, 도서가 전자화되어 전자 문서는 컴퓨터와 파일 서버에 대량으로 저장되었다.보관하는 서류의 종류도 해마다 늘어나는 경향이 있다.이렇게 되면 목적 파일이 어디에 저장되었는지, 어떤 폴더 이름인지, 파일 이름인지 모르는 사람이 많겠지.이럴 때 전문 검색 소프트웨어를 사용하고 키워드로 목적 파일을 검색하면 찾고 있는 파일을 빨리 찾을 수 있다.
전체 텍스트 검색의 전체 프로세스
전체 텍스트 검색의 실현은 크게 다음과 같은 절차로 나뉜다.
(색인 작성)
① 개체 파일 목록 만들기
② 각 객체 파일에서 텍스트 정보 체크 아웃
③ 파일 경로, 파일 이름 및 체크 아웃된 텍스트 정보에 따라 색인 만들기
(찾기)
④ 검색 키워드에 따라 색인을 검색하여 히트 파일 목록 만들기
⑤ 찾은 파일을 명중수, 파일 이름, 업데이트 날짜, 파일 크기 등에 따라 정렬하여 표시
색인 없이 검색할 때마다 실제 존재하는 파일에서 텍스트 정보를 읽어 검색하는 검색 소프트웨어도 있지만, PDF와 Office 파일은 텍스트 추출에 시간이 걸리고 파일 수가 많으면 결과가 나오기까지 시간이 걸려 실용적이지 못하다.검색에 가장 적합한 색인을 미리 만들어서 빠르게 검색할 수 있다.대상 파일의 업데이트가 빈번하지 않을 때, 만약 파일의 업데이트가 검색 결과에 즉시 반영될 필요가 없다면, 색인 방식이 가장 적합하다.하루에 한 번, 일주일에 한 번, 몇 시간에 한 번 등 정기적으로 업데이트를 하면 어느 정도 최신 상태를 검색할 수 있다.
검색 소프트웨어는 C 언어로 만들어졌다.검색에는 어쨌든 시간이 걸린다.파이톤과 PHP 등 해석기 방식의 언어에 따라 컴파일된 고속 동작의 언어를 선택합니다.
다음 장부터 각 기능이 상세하게 기재될 것이다.
① 개체 파일 목록 만들기
색인을 만들 때 검색할 파일 목록을 만듭니다.사용자가 검색하고자 하는 폴더, 파일 형식은 어느 정도 제한되어 있다.자료 폴더의 PDF 파일만 검색하거나 견적 폴더의 Excel 등만 필요한 파일로 압축해 색인을 만들려고 합니다.
② 각 객체 파일에서 텍스트 정보 체크 아웃
파일 컨텐트가 포함된 전체 텍스트를 검색하려면 파일의 텍스트 정보를 추출해야 합니다.텍스트 파일의 경우 파일을 직접 열고 파일 내용의 정보를 읽기만 하면 된다.HTML 파일도 마찬가지로 파일을 열어 읽지만 등의 탭이 있기 때문에 탭 정보를 제외하고 텍스트 정보만 추출할 수 있습니다.Word, Excel, PowerPoint 등의 Office 파일인 경우xlsx야.docx와 같은 확장자 파일은 ZIP로 압축됩니다.예를 들면 Sample.xlsx를 Sample로 변환합니다.xls.확장자를 zip 등으로 변경하면 ZIP 동결해제가 가능합니다.해동된 xml 파일을 읽고 표시를 제거하면 텍스트 정보를 추출할 수 있습니다.그러나 xml 파일에서도 속성 정보 등이 혼합되어 있어 파일에 기술된 내용을 복원하려면 xml의 형식을 해석해야 하기 때문에 이해하기 어렵다.
PDF 파일은 PDF 형식을 보여줍니다.서식에 따라 텍스트 정보를 해석하고 추출하면 되지만 여기도 많은 버전이 있고 글꼴 정보 등이 있어 기록된 문서를 복원하기 어렵다.
따라서 파일 유형의 파일에서 텍스트 정보를 추출하는 외부 도구를 사용합니다.xdoc2txt 정밀도도 좋고 많은 파일 형식에 대응합니다.
xdoc2txt를 사용하여 검색 대상인 각 파일에 대해 텍스트 정보를 일일이 꺼냅니다.
xdoc2txt.bat
cd c:¥test¥xdoc2txt¥
xdoc2txt.exe -s "c:¥temp¥sample1.xlsx" > "c:¥test¥doc¥sample1.txt"
여기 문자 코드는 Shift-JIS로 통일됩니다.UTF8도 가능합니다.모든 문자 코드를 통일해야 한다.또한 각 파일에서 체크 아웃한 텍스트 정보에는 공백, 줄 바꿈, 제어 문자 등의 정보가 포함됩니다.공백이나 줄 바꿈은 텍스트 정보를 이중화하기 때문에 공백, 줄 바꿈, 제어 문자를 삭제합니다.③ 파일 경로, 파일 이름 및 체크 아웃된 텍스트 정보에 따라 색인 만들기
추출한 텍스트 정보를 정리하고 색인을 만듭니다.
나는 인디엑스가 각양각색의 나눔법을 가지고 있다고 생각한다. 여기서 샘플로 다음과 같은 형식을 보여준다.
indexi.dat
색인 대상의 파일 목록을 csv 형식으로 저장합니다
1. 파일 경로 이름
2. m0: index.데이터의 시작 위치
3. m1: index.데이터의 파일 경로 길이
4. m2: index.데이터 파일의 텍스트 정보 길이
index.dat
검색할 텍스트 정보를 저장합니다.파일 경로, 파일의 텍스트, 대상 파일의 수를 반복합니다.
mkindex(void)
int mkindex(void){
int i,m0,m1,m2,h;
char pbuff[5012],buff[5000000];
FILE *fp;
fp = fopen("indexi.dat","wt");
h = open("index.dat",O_WRONLY|O_BINARY|O_APPEND);
for(i=0;i<flist->Count;i++){
strcpy(pbuff,flist->Strings[i].c_str());
m1 = strlen(pbuff);
// テキスト情報を抽出する関数
m2=gfil(flist->Strings[i],buff);
write(h,pbuff,m1);
write(h,buff,m2);
fprintf(fp,"%s,%d,%d,%d\n",flist->Strings[i].c_str(),file_date,file_size,m0,m1,m2);
m0=m0+m1+m2;
}
fclose(fp);
close(h);
return 1;
}
indexi.dat
c:\電報\年賀001.txt,0,19,160
c:\電報\年賀002.txt,179,19,144
c:\電報\年賀003.txt,323,19,1,128
index.dat
c:\電報\年賀001.txt新年明けましておめでとうございます。 旧年中はいろいろとお世話になり、ありがとうございました。本年 もよろしくご指導、ご鞭撻のほどよろしくお願い申しあげます。c:\電報\年賀002.txt新年明けましておめでとうございます。 日頃のご愛顧を厚く御礼申しあげますとともに、今年一年が最良の 年でありますよう、心よりお祈りいたします。c:\電報\年賀003.txt明けましておめでとうございます。 はやばやのお年賀状、うれしく拝見いたしました。 遅ればせながら、新年のご挨拶を申しあげます。
④ 검색 키워드에 따라 색인을 검색하여 히트 파일 목록 만들기
입력 키워드가 포함된 문서를 검색합니다.
키워드에 대해 검색 (char*keyword) 은 색인 파일의 정보를 하나하나 읽는다
검색어가 성공했는지 여부입니다.
gbmMatch(char*text,char*pattern,intlen)는 검색 (char*keyword)에서 호출된 함수로text에pattern 문자가 포함된 횟수(명중수)를 되돌려줍니다.파일 경로와 파일의 문자 정보의 명중수를 계산합니다.
0x81-0x9f, 0xe0-0xef의 경우 Shift-JIS에서 일본어 문자의 2바이트의 경우 구별 처리.
search
int search(char *keyword){
int m0,m1,m2,h;
char spath[5012],bu[5012],pbuff[5012],buff[5000000];
FILE *fp;
fp = fopen("indexi.dat","rt");
h = open("index.dat",O_RDONLY|O_BINARY);
while(fgets(bu, N, fp) != NULL) {
get_csv(bu,spath,m0,m1,m2);
lseek(h,m0,SEEK_SET);
m1 = read(handle,pbuff,m1);
m2 = read(handle,buff,m2);
nml = gbmMatch(pbuff,keyword,m1) + gbmMatch(buff,keyword,m2);
if(nml>0){
printf("%d : %s", nml,spath);
}
}
}
int gbmMatch(char *text, char *pattern,int len)
{
int i,j,patlen,n;
bool flg;
patlen = strlen(pattern);
n = 0;
for(i=0;i<=len-patlen;i++){
for(j=0,flg=true;j<patlen;j++){
if(text[i+j]!=pattern[j]){
flg=false;
break;
}
}
if(flg){
n++;
i=i+patlen-1;
}else if((((unsigned char)text[i]>=(unsigned char)0x81)&&((unsigned char)text[i]<=(unsigned char)0x9f))||
(((unsigned char)text[i]>=(unsigned char)0xe0)&&((unsigned char)text[i]<=(unsigned char)0xef))){
i++;
}
}
return n;
}
⑤ 찾은 파일을 명중수, 파일 이름, 업데이트 날짜, 파일 크기 등에 따라 정렬하여 표시
상기 원본의 견본에서 printf에서 찾은 파일을 출력했지만 실제로는 배열에 저장하고 보안 타수, 파일 이름, 업데이트 날짜나 파일 크기의 순서에 따라 정렬한 다음에 화면에 표시하는 것이 좋다.더욱이 찾은 문서를 앞뒤로 표시하고 키워드에 맞는 부분을 착색해 표시하면 목표를 찾는 문서인지 아닌지를 판단하기 쉽다.
추가 기능
상술한 내용에서 전문 검색 소프트웨어의 주요 기능을 실현할 수 있다.더욱 실용적인 검색 소프트웨어를 위해서는 다음과 같은 기능이 필요하다.
• 검색 기능은 전각 반각, 대문자 소문자, 가명 등의 문자를 구분하지 않는다
AND, OR 검색 기능
• 인덱스 지정 시간 내 자동 업데이트 기능
· 백그라운드에서 인디x 업데이트
또한 샘플 코드에 있는 gbmMatch 검색 방법을 사용하면 1만개 정도의 파일 검색에는 문제가 없지만 검색 대상의 파일 수가 수만개 이상이면 검색에 시간이 걸린다.
최후
이번에 소개한 전문 검색 소프트웨어의 논리는 탐삼랑 기능의 기본 부분을 추출하여 기재한 것이다.
탐삼랑는 무료로 공개돼 누구나 이용할 수 있다.탐삼랑에서 상기 추가 기능을 포함하여 검색할 수 있습니다.
또한탐삼랑에서gbmMatch 검색 외에도 SENNA 검색을 동시에 사용했으며, 10만 부가 넘는 파일도 1초 이내에 검색 결과를 찾을 수 있다.
꼭 다운로드해 보세요.
또한 탐삼랑 모든 원본 파일을 유상으로 제공한다.원본 파일을 제공하려면 작자에 문의하십시오.
Reference
이 문제에 관하여(전문 검색 소프트웨어 만들기 이야기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/koutarou-yamada/items/9dd0d77551c18eddd9bc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)