본문 바로가기
정보공유

[정보]검색엔진이 데이터를 다루는 방법

by 날고싶은커피향 2018. 3. 6.

검색엔진이 데이터를 다루는 방법 관련 자료입니다.

내용 참고 하시기 바랍니다.

 

 

검색엔진이 데이터를 다루는 법 김종민 from 종민 김

 

1. 1 김종민 kimjmin@gmail.com, jongmin.kim@elastic.co 검색엔진이 데이터를 다루는 방법
2.  22 저는… 2015년 부터 Tech Evangelist (== 입개발자) @Elastic
 3.  3 Elastic?
 4.  4 Elastic? • Elasticsearch 라는 검색엔진을 개발한 회사입니다. ‒ (ELK Stack 으로 더 잘 알려져 있습니다.) • 검색엔진은 우리 주변 여기저기에 있습니다. • 요즘은 검색엔진이 데이터 분석에도 쓰입니다. 2017 데이터야 놀자
5.  Elastic Stack 100% open source
 6.  6 https://db-engines.com/en/ranking/search+engine
 7.  7 2012년 설립. 현재 직원은 600명 정도. 한국은 7명. 본사는 네델란드 암스텔담과 캘리포니아 마운틴 뷰에 있습니다. 7
 8.  8 아파치 루씬 (Apache Lucene) • Created by - Doug Cutting • Written in - Java • Apache Solr, Elasticsearch
 9.  9 RDBMS 에서는 데이터를 테이블 형태로 저장합니다. 열을 기준으로 인덱스를 만듭니다. 책의 맨 앞에 있는 제목 리스트와 같습니다. DOC TEXT 1 The quick brown fox jumps over the lazy dog 2 Fast jumping rabbits
 10.  10 검색엔진에서는 inverted index 라는 구조로 저장합니다. RDBMS 와 반대 구조입니다. 텍스트를 다 뜯어서 검색어 사전을 만듭니다. 책의 맨 뒤에 있는 페이지를 가리키는 키워드 같습니다. TOKEN (TERM) DOC TOKEN (TERM) DOC Fast 2 jumps 1 The 1 lazy 1 brown 1 over 1 dog 1 quick 1 fox 1 rabbits 2 jumping 2 the 1
 11.  11 실제로는 이렇게 저장됩니다. 텍스트를 저장할 때 몇가지 처리 과정을 거칩니다. TOKEN (TERM) DOC TOKEN (TERM) DOC brown 1 lazi 1 dog 1 over 1 fast 1 , 2 quick 1 , 2 fox 1 rabbit 2 jump 1 , 2
 12.  12 텍스트 처리 과정 대소문자를 변환 합니다. TOKEN (TERM) DOC TOKEN (TERM) DOC Fast  fast 2 jumps 1 The  the 1 lazy 1 brown 1 over 1 dog 1 quick 1 fox 1 rabbits 2 jumping 2 the 1
 13.  13 텍스트 처리 과정 토큰을 (보통 ascii 순서로) 재 정렬합니다. TOKEN (TERM) DOC TOKEN (TERM) DOC brown 1 lazy 1 dog 1 over 1 fast 2 quick 1 fox 1 rabbits 2 jumping 2 the 1 jumps 1 the 1
 14.  14 텍스트 처리 과정 불용어(stopwords, 검색어로서의 가치가 없는 단어들) 를 제거합니다. a, an, are, at, be, but, by, do, for, i, no, the, to … 등등 TOKEN (TERM) DOC TOKEN (TERM) DOC brown 1 lazy 1 dog 1 over 1 fast 2 quick 1 fox 1 rabbits 2 jumping 2 the 1 jumps 1 the 1
 15.  15 텍스트 처리 과정 형태소 분석 과정을 거칩니다. 보통 ~s, ~ing 등을 제거하는 과정입니다. 한글은 의미 분석을 해야 해서 좀 더 복잡합니다. TOKEN (TERM) DOC TOKEN (TERM) DOC brown 1 lazy  lazi 1 dog 1 over 1 fast 2 quick 1 fox 1 rabbits  rabbit 2 jumping  jump 2 jumps  jump 1
 16.  16 텍스트 처리 과정 jumping, jumps가 jump 로 똑같이 바뀌었으므로 토큰을 병합 해 줍니다. TOKEN (TERM) DOC TOKEN (TERM) DOC brown 1 lazi 1 dog 1 over 1 fast 2 quick 1 fox 1 rabbit 2 jump 1 , 2
 17.  17 텍스트 처리 과정 동의어를 처리합니다. TOKEN (TERM) DOC TOKEN (TERM) DOC brown 1 lazi 1 dog 1 over 1 fast 1 , 2 quick 1 , 2 fox 1 rabbit 2 jump 1 , 2
 18.  18 검색 과정 검색어도 똑같이 텍스트 처리를 합니다. “The lazy spiders” 라고 검색하면 The lazy rabbits lazi rabbit 1 DOC TEXT 1 The quick brown fox jumps over the lazy dog 2 Fast jumping rabbits 2
 19.  19 검색엔진은 RDBMS 검색엔진 데이터 저장 방식 정규화 역정규화 전문(Full Text) 검색 속도 느림 빠름 의미 검색 불가능 가능 Join 가능 불가능 수정 / 삭제 빠름 느림
20.  20 Elasticsearch 클러스터링 과정 대용량 검색을 위해서는 클러스터링이 필요합니다. Elasticsearch는 데이터를 샤드(Shard) 단위로 분리해서 저장합니다. 10 2 3 4 노드 (Node) Elasticsearch 실행 프로세스 샤드 (Shard) 루씬 검색 쓰레드
21.  21 10 2 3 4 Elasticsearch 클러스터링 과정 노드를 여러개 실행시키면 같은 클러스터로 묶입니다. Elasticsearch 클러스터(Cluster)
 22.  22 20 1 4 3 Elasticsearch 클러스터링 과정 샤드들은 각각의 노드들에 분배되어 저장됩니다.
23.  23 20 3 41 04 13 2 무결성과 가용성을 위해 샤드의 복제본을 만듭니다. 같은 내용의 복제본과 샤드는 서로 다른 노드에 저장됩니다. Elasticsearch 클러스터링 과정
24.  24 20 3 41 04 13 2 시스템 다운이나 네트워크 단절 등으로 유실된 노드가 생기면 Elasticsearch 클러스터링 과정
25.  25 20 3 41 04 13 2 4 0 복제본이 없는 샤드들은 다른 살아있는 노드로 복제를 시작합니다. Elasticsearch 클러스터링 과정
26.  26 20 3 41 13 2 4 0 노드의 수가 줄어들어도 샤드의 수는 변함 없이 무결성을 유지합니다. Elasticsearch 클러스터링 과정
27.  27 20 3 41 13 2 4 0 처음 쿼리 수행 명령을 받은 노드는 모든 샤드에게 쿼리를 전달합니다. 1차적으로 모든 샤드(또는 복제본에서) 검색을 실행합니다. 검색 과정 – Query Phase client
 28.  28 20 3 41 13 2 4 0 “from + size” 크기의 결과 큐를 처음 명령 받은 노드로 리턴합니다. 리턴된 결과는 루씬 doc id 와 랭킹 점수만 가지고 있습니다. 노드는 리턴된 결과들을 가지고 랭킹 점수 기반으로 정렬합니다. 검색 과정 – Query Phase client
 29.  29 20 3 41 13 2 4 0 정렬된 값 기반으로 유효한 샤드들에 검색 결과들을 요청합니다. 검색 과정 – Fetch Phase client
 30.  30 20 3 41 13 2 4 0 전체 문서 내용(_source) 등의 정보가 리턴되어 클라이언트로 전달됩니다. 검색 과정 – Fetch Phase client
 31.  31 검색엔진에서는 정확한 검색을 위한 랭킹 알고리즘이 정말 정말 중요합니다.
32.  32 랭킹 알고리즘 보통은 TF/IDF 를 많이 씁니다. Elasticsearch 5.0 부터는 BM25 라는 알고리즘을 사용합니다.
33.  33 TF / IDF • Term Frequency ‒ 찾는 검색어가 문서에 많을수록 해당 문서의 정확도가 높습니다. • Inverse Document Frequency ‒ 전체 문서에서 많이 출현한 (흔한) 단어일수록 점수가 낮습니다. Term Frequency / Inverse Document Frequency
 34.  34 검색 랭킹이 중요한 이유 • 사용자들은 대부분 처음 나온 결과만 봅니다. • 결과값이 큰 내용을 fetch 하는 것은 상당히 부하가 큽니다. • 1~1,000 을 fetch 하는 것이나 990~1,000 을 fetch 하는 것이나 쿼리 작업 규모가 비슷합니다. • 구글도 랭킹이 중요하긴 마찬가지… 2017 데이터야 놀자
35.  35 루씬 세그먼트(Segment) Inverted Index, Doc Value, 원본 문서 등등을 저장하고 있는 단위 파일입니다. 샤드 세그먼트문서 • 루씬은 inverted index를 하나의 거 대한 파일이 아니라 여러개의 작은 파일 단위로 저장합니다. • 입력 버퍼가 가득 차거나, 1초 마다 하나씩 생성됩니다. • 한번 생성된 세그먼트는 변경되지 않습니다. (immutable)
 36.  36 문서 변경/삭제 과정 • update는 없습니다. 모두 delete & insert 입니다. • 문서를 삭제하면 삭제되었다는 상태만 표시하고 검색에서 제외합니다. • 나중에 세그먼트 병합 과정에서 삭제된 문서를 빼고 나머지 문서들을 모아 새로운 세그먼트를 만듭니다. ‒ 그래서 문서를 삭제 하더라도 세그먼트 병합을 하기 전 까지 스토리지 용량은 줄어들지 않 습니다. • 세그먼트 병합은 비용이 큰 동작입니다. ‒ 디스크 I/O 작업입니다. ‒ 시스템이 느려집니다. ‒ 가능하면 사용자들이 적은 시간에 하는것이 좋습니다. 한먼 생성된 세그먼트는 변경되지 않습니다.
37.  37 세그먼트 병합(Segment Merge) http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 3 7 8 9 10 12 13 15
 38.  38 세그먼트 병합(Segment Merge) http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html • 오래된 세그먼트는 크기가 크고 최근 생성된 세그먼트는 상대적으로 크기가 작습니다. • 오래된 문서를 삭제하는 것은 더욱 비용이 큽니다. • 날짜별로 저장 영역(인덱스)를 구분하는 것이 바람직합니다. ‒ Elasticsearch 에서는 여러 인덱스를 묶어서 검색할 수 있는 멀티테넌시를 지원합니다.
39.  39 Elasticsearch 사용하시려면 • 로그는 가능하면 날짜별로 나눠서 저장하세요. • 원본 데이터는 항상 잘 가지고 계세요. 새로 부어야 하는 경우가 많습니다. • 세그먼트 병합은 사용하지 않는 시간에.
40.  40 https://www.elastic.co/kr/ https://www.facebook.com/groups/elasticsearch.kr 감사합니다.
 

반응형