전문 검색엔진 만들어 보기#1:개요~설치편

4553 단어 검색 엔진
개시하다
'검색엔진 자작 입문'이라는 책을 샀기 때문에 읽으면서 실천했다.
개인 학습 목적의 기사인 만큼 기본적으로 메모 같은 내용이다.
처음에는 정보 디자인을 배우기 위해'정보 구조 4판'을 읽었다.
나는 정보를 저장하는 메커니즘이 어떻게 인덱스를 하는지에 관심이 생겨서 이럴 때 검색엔진을 만들어 보겠다는 생각이 들었다.
솔직히 정보 디자인을 이해하는 기초 위에서 검색엔진을 만들 필요가 없다.
뭐, 할 기분이 들어서 간신히 해보자.
전문 검색엔진은?
개요
아주 깔끔하게 말하면 파일을 검색하는 구조다.
익숙한 구글을 비롯한 웹 검색엔진이 대표적이죠.
간단하게 말하면 검색엔진은 광의와 협의 두 가지로 나눌 수 있지만 이번 검색엔진은 광의적으로 사용된 전문 검색엔진이다.
자세한 내용은 구글이나 위키백과를 참고하세요.
위키백과 검색엔진
전체 텍스트 검색엔진 구성

※ 주: 야마다 고지, 말영광(저)의 (2014/9/25) p.14 그림1-1에 따라 제작
상술한 허선과 같은 부분은 이른바 전문 검색엔진의 주요 기능이다.
허허ω^)
뭐, 구성 요소의 이름에서 대체적으로 추측할 수 있다.
자세히 보면 다음과 같은 흐름 동작의 패턴으로.

  • 인덱스 구축기 문서에서 인덱스 만들기
  • 생성된 인덱스를 인덱스 관리자에 저장
  • 문서는 문서 관리자에 저장

  • 색인 검색기는 검색 응용 프로그램에서 검색 검색을 받는다

  • 색인 관리자에서 검색 질의와 일치하는 색인 가져오기
  • 인덱싱된 정보에서 문서 관리자의 데이터를 찾아낸다
  • 검색 애플리케이션으로 돌아가기
  • 그렇구나.
    여기를 보면 다음 두 가지가 마음에 든다.
  • 인덱스는 어떤 구조를 가지고 있습니까?
  • 색인을 어떻게 만듭니까?
  • 내가 더 자세히 쫓아갈게.
    색인 구조
    keyword
    page
    qiita
    P1,P2
    article
    P1
    위의 목록은 색인의 구조입니다.
    허허ω^)
    색인에도 여러 종류가 있는 것 같습니다. 색인을 바꾸는 종류의 색인을 보여 줍니다.
    전문 검색엔진에서 사용하는 색인 구조에서 대표적인 위치인 것 같습니다.
    다만'이 키워드는 ○○페이지에 있다'는 뜻으로 이해하기는 간단하다.
    색인 작성 방법
    그렇다면 어떻게 색인을 만듭니까? 그렇게 말하지만 상세한 내용을 알게 되면 아주 간단합니다.
  • '어느 페이지에서 어떤 단어를 사용했는지'를 조사해 목록을 작성(페이지: 행, 단어: 열)
  • 매트릭스를 바꾸어'어떤 단어가 어느 페이지에서 사용되는지'목록을 만듭니다(단어: 행, 페이지: 열)
  • 요약 페이지의 열, 간소화
  • 요컨대
    qiita
    article
    P1
    1
    1
    P2
    1
    0
    ↑ 이것은
    keyword
    page
    qiita
    P1,P2
    article
    P1
    이렇게 될 거라면서요?
    세부 사항은 잠시 말하지 않고 기본적으로 이해하다.
    참고 서적에 전문 검색엔진의 샘플이 준비되어 있으니 내가 먼저 시험해 보겠다.
    설정
    환경 구조
    참고서적에서 사용하는 언어는 C 언어이기 때문에 C 언어를 구동할 수 있는 환경을 만들어야 한다.
    C는 진지하게 건드린 적이 없으니 방법이 있을 거야.
    1.gcc 설치
    gcc는 C의 컴파일러입니다.
    맥이면 엑스코드가 설치된 Command Line Tools가 같이 들어간다.
    넣었으니까 사랑을 끊어.
    2. Hello World
    아무래도'헬로 월드'부터 하자.
    다음 파일을 만듭니다.
    hello.c
    #include <stdio.h>
    int main(void){
      printf("Hello World\n");
      return 0;
    }
    
    그리고 gcc로 컴파일합니다.
    $ gcc ./hello.c
    $ ls
    a.out     hello.c
    
    순조롭게 편역을 마쳤다.
    일단 해봐.
    $ ./a.out
    Hello World
    
    했네.
    이렇게 되면 언젠가는 방법이 있을 거라고 나는 생각한다.
    전문 검색엔진의 샘플을 준비하다
    wiser라는 포장을 사용하세요.
    기릿허브까지 올랐다.
    그걸 그냥 이용하는 거야.
    종속성 패키지 설치
    $ brew install sqlite expat
    
    expat C의 XML Parer와 같습니다.
    데이터 준비
    일본어 버전 위키백과를 활용한 데이터.
    ↓에서 최신 XML을 제거하세요.
    https://dumps.wikimedia.org/jawiki/
    그리고 해동한다.
    bunzip2 -k jawiki-latest-pages-articles.xml.bz2
    
    나는 해동에 많은 시간을 썼다.
    주의하십시오.
    동작 확인
    $ ./wiser
    usage: ./wiser [options] db_file
    ...
    
    어, 움직였어.
    우선 색인을 만들어 보세요.
    $ ./wiser -x jawiki-latest-pages-articles.xml -m 1000 wikipedia_1000.db
    [time] 2019/01/10 01:39:41.000004
    count:1 title: Wikipedia:アップロードログ 2004年4月
    count:2 title: Wikipedia:削除記録/過去ログ 2002年12月
    count:3 title: アンパサンド
    count:4 title: Wikipedia:Sandbox
    count:5 title: 言語
    count:6 title: 日本語
    count:7 title: 地理学
    ・・・
    
    에이--(작은 보통감)
    다음은 실제로 검색해 봅시다.
    서적에서 지시한 대로 검색 perl 의 문자열을 참고하십시오.
    ./wiser -q 'perl' wikipedia_1000.db
    [time] 2019/01/10 01:45:04.000004
    document_id: 731 title: Perl score: 448.038067
    document_id: 879 title: バイオインフォマティクス score: 17.152566
    Total 2 documents are found!
    [time] 2019/01/10 01:45:04.000004 (diff   0.007252)
    
    대단해... (보통감)
    혼자 한 건 아니지만 흥분했어요.
    이번엔 일단 여기까지.
    다음 계획
    전치 색인을 구축하는 기능을 만들고 싶습니다.
    단지 이 항목을 쓸 때,wiser에 허가증이 없다는 것을 발견했다.
    기사에서 직접 원본 코드를 사용할 수 없는 문제...
    직접 만들지 않으면 공개할 수 없기 때문에 먼저 원래의 원본 코드의 읽기와 이해를 하세요.

    좋은 웹페이지 즐겨찾기