본문 바로가기

Programming

문과도 이해가능한 컴공필수지식-②검색엔진은 어떻게 작동할까?

0. HTTP 프로토콜


HTTP프로토콜에 관해 글을 먼저 쓸까 했는데 너무 방대하고 끝도 없어.. 

무엇보다 재미가 없을꺼 같아서 생략하고 아주아주 간략하게만 보고 넘어가자!

혹시 관심있는 사람은 "O'Reilly - HTTP - The Definitive Guide pdf"라고 치면 2002년 버전이 나올꺼야.

그것을 참고하도록 해. 혹시 웹쪽으로 가려는 컴공학생은 무조건 완독하기 바란다.

HTTP프로토콜은 "프로토콜"이란 말에서 알 수 있듯이 서로 주고 받을 수 있게끔 미리 약속 해 놓은 거야.

그림을 보자.




이런식으로 요청과 응답으로 나뉘어 지는데 

요청은 HTTP요청이라고 하고 응답은 HTTP응답이라고 해.

요청 양식과 응답 양식이 정해져 있어 보통 브라우저가 HTTP요청을 날리면 

웹서버에서 그것을 받아 HTTP응답을 해주고 요청 컨텐츠를 HTTP응답에 같이 포함시켜 브라우저에게 보내주게 되고

브라우저는 그것을 받아 화면에 예쁘게 그려주지.



하나만 보고 갈까??


https://www.google.com/noexists.txt


라고 쳐볼래?


구글의 루트 디렉토리에 있는 noexists.txt를 요청한건데


사실 이런 txt파일이 있을리 없잖아?? 그래서 HTTP응답을 "컨텐츠는 없으니 돌아가"라고 응답을 해줘야해


이런 상태코드를 나타내는 것이 404코드야.


크롬쓰는 사람은 네트워크를 열어서 확인해 봐!


보니까 10초후에 리다이렉트 되게끔 해놨던데 10초후 다시 본 사이트로 돌아가게끔 해놨더라고


그리고 주석처리한 php코드 보인다 

<!--?php


header('HTTP/1.1 503 Service Temporarily Unavailable');


header('Status: 503 Service Temporarily Unavailable');


header('Retry-After: 30');//30 seconds


?-->



이렇게 되있던데 여기서 보면 상태코드를 503으로 하라는 거거든.


상태코드 503은 "서버가 오버로드되었거나 유지관리를 위해 다운되었기 때문에 현재 서버를 사용할 수 없다. 이는 대개 일시적인 상태이다." 라는 의미야. 


아마 내가 생각하기에 사이트 DB정비할때 주석 풀어서 사용하다가 DB정비 다하면 주석을 다시 하는거 같은데 ㅋㅋㅋ


http://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C


여기에 보면 HTTP상태 코드 있으니 참고하려면 참고해 ㅋㅋㅋ




알고 가야 할 것은 "HTTP요청을 해주면 HTTP응답에 요청 컨텐츠를 담아 전달해 준다."라는 거!




1. 웹 크롤러



보통은 HTTP요청을 날리는 쪽은 브라우저야.


익스플로러, 사파리, 크롬, 오페라, 파이어폭스 등등 유저가 클릭하거나


주소창에 주소를 입력하여 HTTP요청을 날리게 돼!




하지만 웹 크롤러는 소프트웨어야. 즉, HTTP요청을 날리게끔 프로그래밍 되어 있는 소프트웨어야. 


사실 HTTP프로토콜은 많은 변화를 겪은 프로토콜이야.


그래서 완벽한 웹크롤러를 만드려면 HTTP프로토콜을 빠삭하게 꿰뚫고 있어야 하지.


HTTP의 버전이 좀 많아 서 그것에 맞게 또 프로그래밍 해줘야 하고


낡은 웹서버 같은경우 HTTP응답이 완벽하지 않는 경우가 있어서 그 경우 에러체크도 해줘야해.


여기서는 단순히 HTTP요청을 날리게끔 프로그래밍 되어 있다고 했는데 이게 사실.. 좀 매우 어려운 과정이야. 




쨋든 웹 크롤러의 임무는 HTTP요청을 날려 웹서버에게 컨텐츠를 요구하고 


응답으로 받은 컨텐츠를 "확보"하는 거야. 




2. "robots.txt"


robots.txt는 웹 로봇을 응대하는 요령?? 요강?? 이라고 해야하나? 자세히 봐보자.


http://www.kyobobook.co.kr/robots.txt




교보문고의 웹크롤러 응대 요령이야.

한번 보자.


User-agent: Googlebot Disallow:  User-agent: * Allow: /

구글의 웹크롤러에대해 웹컨텐츠를 퍼가는 것을 허락하고(disallow에 해당되는게 없으므로)

다른 검색엔진의 웹크롤러에 대해서 루트부터 컨텐츠를 퍼가는 것을 허가한다(allow에 보면 /가 있는데 "/" 가 웹문서 루트야)

robots.txt는 웹문서 루트에 위치하여 웹크롤러에게 이거는 HTTP요청을 통해 퍼가도 되고 

어떤거는 퍼가지말라고 명시해놔. 그래서 웹크롤러들이 보고 피해갈 수 있도록 명시해놓는 거지.

사실은 그딴거 없이 걍 퍼갈수 있어. 하지만 그랬을 경우 법적문제로까지 이어질 수 있어.

그리고 웹크롤러가 퍼가는 양은 매우 커서 웹서버에 부담이 될 수도 있고. 


재밌는건 웹크롤러는 사람이 아니기 때문에 닥치는데로 퍼간다는 점이야. 

그래서 일부로 검색 결과 상위에 올릴려고 컨텐츠에 잡다한 키워드를 다 써놔.




3. 컨텐츠 추출


HTTP응답으로 오는 것은 거의 대부분 HTML태그로 이루어져 있어.

이런거

<HTML>

<body>

</body>

</html>

그래서 이 태그들을 보고 쓸만한 컨텐츠를 뽑아내야해. 

HTML5가 요즘 대세인데 

사실 HTML5는 옛날부터 거론되는 문제점의 솔루션이더라고;;

옛날부터 웹쪽에서 태그에 관해 많은 논쟁이 오갔어. 중요한건 태그에 의미를 부여하자 라는 건데.

"시멘틱 웹"이라고 몇년전부터 많은 관심을 받아오던 거더라고


그래서 요즘에 웹크롤러들은 태그에도 중요도를 두어서 컨텐츠 추출하더라고.

즉, <h1>자동차 제목</h1> <h2>엔진으로 어쩌구저쩌구</h2>

이런식으로 되어 있으면 h1태그에 좀더 가산점을 줘.

그 외에 이미지, pdf, ppt파일 등등 있는데로 HTTP요청날려서 컨텐츠들을 추출해 내지.

그러니까 pdf나 ptt는 파일구조를 오픈시켜 놨어. 그래서 그 오픈된 파일구조를 보고 컨텐츠를 추출해 낼 수 있거든

근데 hwp는 아직까지 파일구조를 오픈시켜 놓지 않았어. 그래서 hwp의 제목을 추출할 수 는 있어도 내부 컨텐츠를 추출하기는 어려워



온톨리지라는게 있어. 

위에는 스마트폰 온톨로지인데 

이게 뭐냐면, 쉽게말해서

인간이 생각하는 사물을 그대로 옮겨 놓은 것이야.

"배"라는 건 타는 배가 있고, 먹는 배가 있잖아??

즉 이런식으로 나눌 수 있어.


타는것- 배

먹는것- 과일 - 배


이런식으로 나눠 놓는 거지. 

그래서 구성된 온톨리지를 기반으로 컨텐츠를 추출하면 더 정확하게 추출 할 수 있어. 

즉, "맛있는 배"라고 검색했을 때 나주 배가 검색결과에 나오게 할 수 있는 거지. 

시소러스라고 들어봤어?? 다 저 과정이야. 저렇게 나눠 놓으면 검색할때 더 논리적으로 정확한 결과를 내놓을 수 있으니

거의 대부분 시소러스를 만드는 작업을 해. 

한의학 쪽이나 뭐.. 여행 , 국가 정보도 다 시소러스를 구축해 놨대.

이런식으로

 


4. 추출한 컨텐츠를 DB에 저장


이 과정이야 말로 검색엔진의 핵심이라고 할 수 있어. 

추출을 하기 까지는 솔직히 그렇게 까다롭지 않아. 하지만 여기서 부터는 난이도가 꽤 심각해.

추출한 컨텐츠는 결국 DB에 저장이 되긴 하는데 다음과 같은 과정을 겪어.


쓸데없는 단어 지우기 -> 토큰화 -> 인덱스 구조에 저장


예를들어 "치킨은 사랑이다"를 추출했으면

쓸데없는 단어를 지워. 이 과정을 거치면 다음과 같이 변해. "치킨사랑"

말그대로 쓸데없는 단어를 지우게 되는거지.

근데 이게 말이 쉽지 사실.. 자연어 처리쪽이라 존나 변수도 많고.. 잘못 지웠다가 정확도가 감소되고 하튼 존나 힘들어.

그래서 온톨리지를 도입하고 시소러스를 가져다가 분석하고 DB에 집어넣어. 근데 이것도.. 어려워.

구글은 이쪽에 대해 알고리즘이 몇백개나 있대. 그래서 구글이 매우 탄탄한 알고리즘을 바탕으로 정확도가 매우 높은 결과를 내놓는 거지.

그 토큰으로 쪼개. "치킨""사랑"

그 다음 인덱스구조에 저장시켜.


그러니까 책뒤에 보면 단어랑 페이지랑 연결시킨거 있지?? 이런거

"애플" -- 132페이지 , 125페이지 , 166페이지, 518페이지

"바나나" -- 200페이지, 204페이지 , 88페이지


이런식?

결국 인덱스 구조는 개념적으로 봤을때 이런식으로 저장되겠지


"치킨" -- "www.sample5.com", "www.sample1.com", "www.sample8.com"

"사랑" -- "www.sample1.com", "www.sample2.com", "www.sample3.com"


이런식으로. 



5. 컨텐츠 평가


즉, 컨텐츠에서 추출한 내용이 얼마나 충실한지 평가하는 거야.

토큰화된 단어끼리 얼마나 연관도가 있고 얼마나 잘 결합되어 있는지 평가하는 거야.

그러니까 

1번 문서 : "치킨은 사랑이다" 

2번 문서 : "치킨은 .............................................................<존나 긴 역사적인 설명> 사랑이야"


2번문서가 더 자세히 치킨과 사랑에 대해 설명되어 있다고 가정했을때 컨텐츠 평가점수가 더 높아야해.

그래서 이부분은 Document Rank라고 거의 핵심이라고 보면돼

많이 유명한 구글 Rank알고리즘에대해 글을 써볼까 하다가.. 너무 지루한거 같아서 일단 스킵할께.


6. 검색어 해석






5번까지만 잘 이루어졌다면 검색사이트의 일반적인 모습은 갖춘거야. 

그리고 마지막 관문인 검색어 해석만 남았어. 보통 검색어를 검색창에 치게 되지.

나는 검색창에 rn라고 치면 연관검색어에 "구글"이 떠서 그거 눌러서 들어오거든

예를들어 "치킨 사랑"이라고 검색하면

컨텐츠를 토큰화하고 나누듯이 검색어도 같은 과정을 거쳐.

"치킨과 사랑" -> "치킨 사랑" -> "치킨" "사랑" 이런식으로 검색어를 파싱하게 되지.

그 외에 부가적으로 고급 검색 변수가 들어갈 수도 있어. 그러니까 2010년도 이상 문서만 검색한다거나

"치킨"와 "사랑"이 둘 다 들어가야 하는 문서거나 등등. 

https://search.naver.com/search.naver?sm=tab_hty.top&where=nexearch&query=%EC%B9%98%ED%82%A8+%EC%82%AC%EB%9E%91&oquery=%EC%B9%98%ED%82%A8&tqi=Uul%2BFspVuEossvSYk1dssssssch-338702


여기서 ? 이후부터는 다 그런 매개변수를 집어 넣은거야.


막 %EA 이렇게 되어 있는거는 "치킨과 사랑"을 UTF8으로 인코딩 한거야. 

다시 UTF8으로 디코딩하면 "치킨과 사랑"으로 돌아오게 되지. 이 이유는 간단해.

한글은 2바이트를 잡아먹는 유니코드라 UTF8으로 인코딩해야 해. 한글을 못알아 먹거든. 그래서 알아 먹을 수 있도록 인코딩을 반드시 해야해.


쨋든 이 토큰화 된것을 바탕으로 인덱스 DB를 뒤져 링크를 검색결과로 돌려주는거야.

"치킨" -- "www.sample5.com", "www.sample1.com", "www.sample8.com"

"사랑" -- "www.sample1.com", "www.sample2.com", "www.sample3.com"


결과 : 

 "www.sample5.com", "www.sample1.com", "www.sample8.com"

 "www.sample1.com", "www.sample2.com", "www.sample3.com"



검색엔진은 포탈마다 다를까? 



기본 개념은 똑같다. 


⑴무작위 봇 크롤링(봇이라는 소프트웨어가 무작위로 각종 사이트에 접속하여서 URL과 HTML 태그등의 정보를 수집) 


⑵DB에 저장 

여기에서 SQL이란게 사용되는데. MySQL이라는 ㅅㅌㅊ 오픈소스 DBMS가 있었는데 자세한 사정이 기억이 안나는데 원래 이게 오라클에서 무료로 풀었다가 오라클이 인수를 당했었나 해서 유료로 배포하게 되고 업뎃도 중단된걸로 기억한다. 그래서 구글이 최근에 서버데이터베이스를 MySQL에서 MariaDB로 바꿨다. 뭐 자세한 내용은 더 알필요는 없고 하여튼 SQL이란놈이 있다. MySQL 알아보고 싶으면 검색해보고


⑶검색창에다가 검색어를 타자로 치면 일단 해당 키워드를 기준으로 해당 계정의 과거검색기록을 토대로 가장 연관성있는 검색어를 보여줌 


⑷그중에 하나를 고르던지 너가 키워드를 완성해서 Enter키 누름 


⑸서버에 검색키워드가 전송되고 그걸 서버에서 빠른속도로 분석해서 (겁나 빠르다) 너가 관심있어할만한 정보들을 검색창에 띄워줌. 


이게 모든 검색엔진의 기본인데 각 기업마다 물론 같은 검색엔진을 쓰진 않는다. 기본 원리는 같은데 다 따로따로 정보를 수집하고 가공하는 알고리즘도 각자 알아서 개발하고 해서 서로 경쟁하고있지. 근데 네이버는 해외사이트나 네이버이외 국내사이트는 잘 수집 안하는걸로 보인다. 아니면 수집을 했는데 일부러 안보여주던지. 뭐 그래서 검색의 갑은 구글이다.