elaborate 2014.10.08 INTRODUCTION TO 검색엔진
들어가기전에 이 ppt 는전혀화려하지않음 ( 테마가 DeepDark 함 ) 그래도최대한정갈하게하려고함 검색엔진은생각보다배경지식이좀많이필요하긴함 그래도부담적게언급하고만넘어가는수준으로하려고함 수학적인부분없음 제가수학을못함 그리고생각보다준비를못함ㅜㅜ 이점후회 ing
다룰내용 검색엔진이란? 용어 오픈소스검색엔진 (Lucene) 간단한실험 다른이야기
검색엔진이란 일반적으로는웹검색엔진을의미 서비스측면에서검색엔진의역할이큼 하지만검색엔진이필요한곳은의외로많음 DB, 메일, 문서내용검색, 데이터분석솔루션, 그룹웨어등등 주로 Full Text Search 에특화된기능을의미
검색엔진이란 말그대로검색을위한엔진 검색 찾고자하는내용을보여주는것 검색엔진의측면에서 Exact matching 만을의미할이유는없음 소위말해개떡같이물어도철썩같이대답하기위함 이게매우많이나아가면 knowledge search 가되겠죠?? 기술적으로말하면 matching score 가높은순서로 top rank 를뽑는작업 엔진 어떠한기능 ( 공통적인 ) 을쉽게구현할수있도록도와주는 software 검색은보통색인과검색으로나뉨 어떤색인도공통적인과정과방법들이있을것이요, 어떤검색도공통적인과정과방법들이있을것이라
의문점 아니 DB Index 를그냥쓰면안돼요? 원하는것만색인하고싶은마음 ( 은접시에놓은포도 ) 은접시 의 은 은의미가있으나, 놓은 의 은 은조사에불구한현실 ex) satisfy, satisfied, satisfying Phrase 검색같은고차원검색이안됨 ( 혹은느림 ) Ex) 안병욱아이유 ~3 ( 문서내의 Token 간거리가 3 이하 ) 다양한통계가쿼리단에서쉽게처리안됨 그래도쓰고싶은데요? DB TEXT Field 는색인이안됨 (prefix 값을주어야만함 ) -- mysql 내가찾는내용이만일 prefix 쪽에없다면망함
의문점 FULLTEXT Field 는 FullText Index 이되는걸요? http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html 파티션테이블에서지원안됨 색인 component 를바꾸기가힘듬 DB가한글, 일본어, 중국어에대해잘알거같아요? Exact Match만찾아줌 Data가바뀌면 Index Tree 전체가흔들흔들 ~ 되는애도있지않아요? 그럼그거쓰세요. PostgreSQL 거의검색엔진과비슷하더이다 http://www.postgresql.org/docs/9.3/static/textsearch.html
그럼이점은뭐가있죠? 데이터따로색인따로 INSERT 도많아죽겠는데그때마다 indexing 들어가면 Transaction 이매우느려질수있음 검색의반영이좀 delay(minutes) 되어도문제없으면분리하는게서비스가원활히될수있음 Fault Tolerance?? 당장 DB 가죽어도서비스가내려가지않음 색인이살아있어서마지막색인까지는검색을제공함 색인방식의 customize 색인하는방식을통해원하는데이터를원하는방법으로추출이가능해데이터분석측면에서쉽게시도가가능 다양한쿼리제공 다차원쿼리를이용해서검색을가능하게함 검색결과에 weight 를주는것도가능
용어 Document Field Value 기본색인단위 Document의내용을구분하는단위각 field는 type을가지고있다 (int, date, text_ko, text_en ) Field 에들어가있는값 Indexing 색인 검색을빠르게하기위해미리하는작업 Querying 질의 만들어진색인을이용해검색을하는작업
용어 Crawling ( 생략 ) Get Raw Data Indexing Parsing Analyzing Tokenizing Filtering Querying Parsing Analyzing Tokenizing Filtering Result!!! ( 생략 )
용어 Parsing Raw Data 를 Document 를생성하기위한작업 cf) 꼭 HTML 일이유는없음 DB Tuple 도가능, PDF 도가능, 뭐든 Document 생성전단계 ex) Tuple : (postid, link, rawhtml, crawldate) Document : (postid, link, domain, tag removed HTML, date, email address, hyperlink count, )
용어 Tokenizing 주어진값을쪼개어분석의단위 Token을만드는작업 Regex 를사용하는게흔함 (sketch regex) 한글 [ ㄱ-ㅎ ㅏ-ㅣ 가-힣 ] 영어 [a-za-z] Email { 영어 }@{ 영어 }.{ 영어 } Twitter Hash #{ 영어 한글 몇몇특수문자 } 가격 { 숫자,}{ 가격단위 } Ex) 안병욱과아이유 (IU) 는아무런사이가아니다 ( 안병욱와, 아이유, (IU), 아무런, 사이가, 아니다 ) Ex) 아!!!!!!! DB 퀴즈가아주쫄깃하구나ㅋㅋㅋㅋ ( 아, DB, 퀴즈가, 아주, 쫄깃하구나 )
용어 Filtering Token 가지고색인될값을뽑아내는작업각 token의종류 (token type) 에따라알맞은처리작업을진행 변형, 삭제, 새로운값삽입 Ex) ( 안병욱와, 아이유 (IU) 는, 아무런, 사이가, 아니다 ) ( 안병욱, 아이유, 아무런, 사이, 아니 ) ( IU ) ( 안병욱, 아이유, 아무런, 사이, 아니 ) ( iu ) Ex) ( 아, DB, 퀴즈가, 아주, 쫄깃하구나 ) (DB, 퀴즈, 아주, 쫄깃 ) (db, 퀴즈, 아주, 쫄깃 )
Token Position Term text Start offset End offset Type
유의 Indexing 과 Querying 은모두각각 Tokenizing 과 Filtering 을진행한다 보통같은 Field 에대해서는같은 Tokenizing 과 Filtering 을거치게설정하지만다르게하는것도충분히가능 원하면 Tokenizing 전체그대로넘겨도됨 원하면 Filtering 안해도됨 요즘은검색엔진을포함해 Crawling, Data Analyzing 까지같이하는검색서버가많다 (search and analyze) Solr, Elasticsearch 이들은앞서말한것들을각각구현체들은자기들의철학에구현하였다
유의 synonyms stopwords elevate facet http://143.248.234.137:8983/solr/pp/select?q=*%3a*&wt=json&in dent=true&facet=true&facet.date=proposed_date&facet.date.ga p=%2b1month&facet.date.start=1900-01- 01T00:00:00Z&facet.date.end=2014-12- 31T00:00:00Z&facet.date.include=lower
오픈소스검색엔진 Lucene Solr Elasticsearch 그이외에매우많음
Lucene 검색엔진임 그냥쓰기는어려워서 ( 구현할게좀많아짐 ) Solr 혹은 Elasticsearch 를이용해서쉽게 manipulation 을함 http://lucene.apache.org/core/ http://lucene.apache.org/solr/ http://www.elasticsearch.org/
Solr 이거은근히편함. 이걸쓰자 요즘은 Elasticsearch 가대세이긴함 Nested document 가능 Parent child Relation 가능 더다양한 field type 있음 근데그건얘네돈벌려고하다보니발전한것. RedHat 같은비즈니스모델 http://lucene.apache.org/solr/tutorial.html
Solr Plug-ins https://wiki.apache.org/solr/solrplugins Solr Plugin 들을만들기위한가이드 Interface 를잘맞춰주고설정에잘알맞게넣으면됨 ( 참쉽죠?) One Tokenizer Token을뽑아내는작업예 ) 웹내용분석기 (WebContentTokenizer) 각 Token 별로 Position, Text, Type, Start, End 값들을부여한다 Type은 KOREAN, EMAIL, PRICE 같이부여할수있음 Jflex 이용하면은근편리함 Multiple TokenFilters 분리된 Token 을조작 ( 주로 Text 값을이용해서 ) 예 ) KoreanFilter 형태소분석을해서조사를없애는작업을진행
간단한실험 강철회원이준데이터를한번써보겠습니다 아근데문제는제가 Relationship 을잘몰라서 ;;; 단순히한 Table 만해보도록하겠습니다 http://lucene.apache.org/core/2_9_4/queryparsersyntax.html https://wiki.apache.org/solr/solrquerysyntax https://github.com/toastdriven/pysolr/ http://143.248.234.137/~elaborate/search_engine/ schema.xml
다른이야기 다른분야의활용 Carrot2 http://project.carrot2.org/ 한글 NLP KAIST 한나눔프로젝트 http://semanticweb.kaist.ac.kr/home/index.php/hannanum 서울대꼬꼬마프로젝트 http://kkma.snu.ac.kr/ 국민대 http://nlp.kookmin.ac.kr/ham/kor/ 부산대 http://urimal.cs.pusan.ac.kr/urimal_new/board/board_oo/main.asp 형태소 -> 문구 -> 문맥의분석에서인류가한것은문구조금까지 http://nlp.stanford.edu/software/lex-parser.shtml
알면좋을만한거 Large Scale Search ( 분산 Index) Sharding Hadoop base Solr (SolrCloud) 어떤이가 Solandra 하다가 SolrCloud 나오고망함 ( 지못미 ) Knowledge Search (Graph Search) 지금까지본건매우기초적인검색엔진포맷 Flatten Search Engine 하지만우리의현실은 Graph 천지 Nested, Parent/Child Denormalization
업계에서는? 웹검색 구글, 네이버, 다음등등 Full Text Data 분석 다음소프트닐슨코리아코난테크 현실괴리 이거생각보다노동많이함 데이터뽑고수작업수작업수작업 데이터가좋아도 Domain Knowledge 없으면시무룩 결국데이터소유자가장땡
동아리에서쓸방법은? 아라어떻습니까아라 내가알기로는 DB Query 라고알고있음 로드가높음그리고정확하지않을확률이큼 KSearch? 글쎄? 잘모르겠음 뭔가모종의문제가있었던걸로기억 ( 형태소분석저작권 ) 어쨌든검색이필요한많은곳에서활용이가능하지않을까
Q&A