차곡차곡 쉽게 알아가는
ELASTICSEARCH와 NODE.JS
황희정
(gyahoo617@gmail.com)
소개
• 상반기/하반기 년 2회 오프라인 스터디 진행
• 다양한 기술 스터디
• Java, Spring, HTML, CSS, SQL, 검색엔진(Elasticsearch),
머신러닝 등 최신 IT 트렌드
• 자바카페 페이스북 : https://www.facebook.com/groups/javacafe/
• 자바카페 기술 블로그 : http://tech.javacafe.io/
발표순서
• 검색엔진과 Elasticsearch 소개
• Elasticsearch에서의 색인
• Elasticsearch에서의 조회
• Node.js 로 구현된 예제 소개
예제소개 https://youtu.be/JEVCMqyYUL8
관계형 데이터 베이스(RDB)에서 검색의 한계
• 긴 문서에서 like 검색은?
• 문서의 길이가 길고 다량의 문서에서 유사한 문서는 어떻게 찾을까?
• 등등...
OPEN SOURCE SEARCH ENGINE
• Java 기반 오픈 소스 검색엔진
• Apache Lucene, Apache Solr, Elasticsearch
TREND
• 출처 : DB-Engines.com
ELASTICSEARCH 특징
• Apache Lucene 기반
• 분산형 RESTful 검색 및 분석 엔진
• 정형, 비정형, 위치정보, 메트릭 등 원하는 방법으로 다양한 유형의 검색을 수행하고 결합 가능
• 초당 엄청난 양의 이벤트를 처리할 수 있도록 수평적 확장이 가능
• 최소 요구사항 : Java 8 이상, 메모리 4G이상
검색엔진에서의 색인과 검색
ELASTICSEARCH에서의 색인
HTTP
SAVE
ELASTICSEARCH에서 색인 과정에서의 색인과 분석
• Tokenizer(토크나이저) : 문자열을 단어 단위로 잘라서 토큰을 만듦
• TokenFilter(토큰 필터) : 토크나이저에 의해 만들어진 토큰을 변형(예: 대문자->소문자화, a, the 삭제 등)
• Inverted Index(역색인) : 토큰과 토큰에 관한 정보를 가지고 있는 자료 구조로 저장
Tokenizer
Token Filter Inverted Index
ELASTICSEARCH에서 검색 과정
• 사용자의 질의 분석
• 사용자의 질의와 일치하거나 유사한 문서 검색
• 결과 반환
Tokenizer
Token Filter
Query
Inverted Index
Result
한국어 분석기
• 한나눔, 꼬꼬마, Komoran, Mecab, Twitter, 아리랑 등
한나눔 꼬꼬마 Komoran Mecab Twitter
아버지가방에들어가 / N 아버지 /
NNG
아버지가방에들어가신다
/ NNP
아버지 / NNG 아버지 / Noun
이 / J 가방 /
NNG
가 / JKS 가방 / Noun
시ㄴ다 / E 에 / JKM 방 / NNG 에 / Josa
들어가 /
VV
에 / JKB 들어가신 /
Verb
시 / EPH 들어가 / VV 다 / Eomi
ㄴ다 /
EFN
신다 / EP+EC
출처 : http://konlpy.org/ko/latest/morph/#comparison-between-pos-tagging-classes
ELASTICSEARCH 설치
• 공식 홈페이지에서 elasticsearch 다운로드
• Elasticsearch 실행
• 리눅스 : Bin 하위 디렉토리의 elasticsearch 쉘 실행
• 윈도우 : Bin 하위 디렉토리의 elasticsearch.bat 실행
• 참고
• https://www.elastic.co/kr/downloads/elasticsearch
RESTFUL API WITH JSON OVER HTTP
• RESTfulAPI 를 사용하여 Elasticsearch 와 통신할 수 있음
• 제공하는 API
• Document API
• Search API
• Indices API
• Cat API
• Cluster API
• 등등
• 참고 : https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
ELASTICSEARCH CLIENT LIBRARY
• 공식 지원
• Curl
• Java
• C#
• Python
• JavaScript
• PHP
• Perl
• Ruby
• 커뮤니티 제공
• B4J, Clojure,ColdFusion (CFML),Erlang,Go,Groovy,Haskell,Java,JavaScript,kotlin,Lua,.NET,OCaml,Perl,PHP,Python,R,
Ruby,Rust,Scala,Smalltalk,Vert.x
NPM
• NPM 프로젝트의 경우
• npm install elasticsearch
예제 소개
데이터 출처 : 영화관입장권통합전산망 오픈 API (영화진흥위원회)
https://youtu.be/JEVCMqyYUL8
ARCHITECTURE
1. 읽기
영화정보 2. 색인
1. 검색요청
2. 검색
3. 결과반환
{ "movieCd": "20173732", "movieNm":
"살아남은 아이", "movieNmEn": "Last
Child", "prdtYear": "2017", "openDt": "",
"typeNm": "장편", "prdtStatNm": "기타",
"nationAlt": "한국", "genreAlt":
"드라마,가족", "repNationNm": "한국",
"repGenreNm": "드라마", "directors":
[ { "peopleNm": "신동석" } ],
"companys": []}
인덱스 설계
자동완성어 검색
영화 검색
인덱스 설계
movie_autocomplete
movie
{ "movieCd": "20173732", "movieNm":
"살아남은 아이", "movieNmEn": "Last
Child", "prdtYear": "2017", "openDt": "",
"typeNm": "장편", "prdtStatNm": "기타",
"nationAlt": "한국", "genreAlt":
"드라마,가족", "repNationNm": "한국",
"repGenreNm": "드라마", "directors":
[ { "peopleNm": "신동석" } ],
"companys": []}
{ "token": "ㅇ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 }
{ "token": "ㅇㅏ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 }
{ "token": "ㅇㅏㅂ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 }
{ "token": "ㅇㅏㅂㅓ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 }
{ "token": "ㅇㅏㅂㅓㅈ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 }
{ "token": "ㅇㅏㅂㅓㅈㅣ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 }
{ "token": "아버지/N", "start_offset": 0, "end_offset": 3, "type": "N", "position": 0 }
{ "token": "방/N", "start_offset": 4, "end_offset": 5, "type": "N", "position": 1 }
{ "token": "들어가/V", "start_offset": 6, "end_offset": 9, "type": "V", "position": 2 }
한글자모분석기
은전한닢s
ELASTICSEARCH CLIENT
• Elasticsearch 클라이언트
• 재사용 가능한 객체
• 내부적으로는 curl –XGET ‘localhost:9200’ 과 같은 원리
INDEX(인덱스) 생성
• Indices API 사용
• 인덱스명과 인덱스에 사용할 분석기 지정
• 자동완성어의 경우 : 자모분석기 사용
• 영화 검색의 경우 : s은전한닢 분석기 사용
movie_autocomplete
movie
인덱스 필드 매핑설정
컬럼 내용 Type Analyzer 예
movieCd 영화코드 keyword - 20173732
movieNm 영화이름 text 은전한닢s 살아남은 아이
prdtYear 개봉년도 integer - 2017
genreAlt 장르 종류 Keyword
(array)
- 드라마,가족
movie_autocomplete
movie
컬럼 내용 Type Analyzer 예
movieCd 영화코드 keyword - 20173732
movieNm 영화이름 text 한글자모분석 살아남은 아이
prdtYear 개봉년도 integer - 2017
genreAlt 장르 종류 Keyword
(array)
- 드라마,가족
데이터 색인
• Bulk API 를사용해서 데이터 색인
• 색인이 이루어지는 동안에도 조회가 가능 (준실시간 검색 가능)
데이터 조회 및 집계
• Search API 사용
자동완성어 검색
영화 검색
집계
movie
movie_
autocomplete
THANK YOU

차곡차곡 쉽게 알아가는 Elasticsearch와 Node.js

  • 1.
    차곡차곡 쉽게 알아가는 ELASTICSEARCH와NODE.JS 황희정 (gyahoo617@gmail.com)
  • 2.
    소개 • 상반기/하반기 년2회 오프라인 스터디 진행 • 다양한 기술 스터디 • Java, Spring, HTML, CSS, SQL, 검색엔진(Elasticsearch), 머신러닝 등 최신 IT 트렌드 • 자바카페 페이스북 : https://www.facebook.com/groups/javacafe/ • 자바카페 기술 블로그 : http://tech.javacafe.io/
  • 3.
    발표순서 • 검색엔진과 Elasticsearch소개 • Elasticsearch에서의 색인 • Elasticsearch에서의 조회 • Node.js 로 구현된 예제 소개
  • 4.
  • 5.
    관계형 데이터 베이스(RDB)에서검색의 한계 • 긴 문서에서 like 검색은? • 문서의 길이가 길고 다량의 문서에서 유사한 문서는 어떻게 찾을까? • 등등...
  • 6.
    OPEN SOURCE SEARCHENGINE • Java 기반 오픈 소스 검색엔진 • Apache Lucene, Apache Solr, Elasticsearch
  • 7.
    TREND • 출처 :DB-Engines.com
  • 8.
    ELASTICSEARCH 특징 • ApacheLucene 기반 • 분산형 RESTful 검색 및 분석 엔진 • 정형, 비정형, 위치정보, 메트릭 등 원하는 방법으로 다양한 유형의 검색을 수행하고 결합 가능 • 초당 엄청난 양의 이벤트를 처리할 수 있도록 수평적 확장이 가능 • 최소 요구사항 : Java 8 이상, 메모리 4G이상
  • 9.
  • 10.
  • 11.
    ELASTICSEARCH에서 색인 과정에서의색인과 분석 • Tokenizer(토크나이저) : 문자열을 단어 단위로 잘라서 토큰을 만듦 • TokenFilter(토큰 필터) : 토크나이저에 의해 만들어진 토큰을 변형(예: 대문자->소문자화, a, the 삭제 등) • Inverted Index(역색인) : 토큰과 토큰에 관한 정보를 가지고 있는 자료 구조로 저장 Tokenizer Token Filter Inverted Index
  • 12.
    ELASTICSEARCH에서 검색 과정 •사용자의 질의 분석 • 사용자의 질의와 일치하거나 유사한 문서 검색 • 결과 반환 Tokenizer Token Filter Query Inverted Index Result
  • 13.
    한국어 분석기 • 한나눔,꼬꼬마, Komoran, Mecab, Twitter, 아리랑 등 한나눔 꼬꼬마 Komoran Mecab Twitter 아버지가방에들어가 / N 아버지 / NNG 아버지가방에들어가신다 / NNP 아버지 / NNG 아버지 / Noun 이 / J 가방 / NNG 가 / JKS 가방 / Noun 시ㄴ다 / E 에 / JKM 방 / NNG 에 / Josa 들어가 / VV 에 / JKB 들어가신 / Verb 시 / EPH 들어가 / VV 다 / Eomi ㄴ다 / EFN 신다 / EP+EC 출처 : http://konlpy.org/ko/latest/morph/#comparison-between-pos-tagging-classes
  • 14.
    ELASTICSEARCH 설치 • 공식홈페이지에서 elasticsearch 다운로드 • Elasticsearch 실행 • 리눅스 : Bin 하위 디렉토리의 elasticsearch 쉘 실행 • 윈도우 : Bin 하위 디렉토리의 elasticsearch.bat 실행 • 참고 • https://www.elastic.co/kr/downloads/elasticsearch
  • 15.
    RESTFUL API WITHJSON OVER HTTP • RESTfulAPI 를 사용하여 Elasticsearch 와 통신할 수 있음 • 제공하는 API • Document API • Search API • Indices API • Cat API • Cluster API • 등등 • 참고 : https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html
  • 16.
    ELASTICSEARCH CLIENT LIBRARY •공식 지원 • Curl • Java • C# • Python • JavaScript • PHP • Perl • Ruby • 커뮤니티 제공 • B4J, Clojure,ColdFusion (CFML),Erlang,Go,Groovy,Haskell,Java,JavaScript,kotlin,Lua,.NET,OCaml,Perl,PHP,Python,R, Ruby,Rust,Scala,Smalltalk,Vert.x
  • 17.
    NPM • NPM 프로젝트의경우 • npm install elasticsearch
  • 18.
    예제 소개 데이터 출처: 영화관입장권통합전산망 오픈 API (영화진흥위원회) https://youtu.be/JEVCMqyYUL8
  • 19.
    ARCHITECTURE 1. 읽기 영화정보 2.색인 1. 검색요청 2. 검색 3. 결과반환 { "movieCd": "20173732", "movieNm": "살아남은 아이", "movieNmEn": "Last Child", "prdtYear": "2017", "openDt": "", "typeNm": "장편", "prdtStatNm": "기타", "nationAlt": "한국", "genreAlt": "드라마,가족", "repNationNm": "한국", "repGenreNm": "드라마", "directors": [ { "peopleNm": "신동석" } ], "companys": []}
  • 20.
  • 21.
    인덱스 설계 movie_autocomplete movie { "movieCd":"20173732", "movieNm": "살아남은 아이", "movieNmEn": "Last Child", "prdtYear": "2017", "openDt": "", "typeNm": "장편", "prdtStatNm": "기타", "nationAlt": "한국", "genreAlt": "드라마,가족", "repNationNm": "한국", "repGenreNm": "드라마", "directors": [ { "peopleNm": "신동석" } ], "companys": []} { "token": "ㅇ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 } { "token": "ㅇㅏ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 } { "token": "ㅇㅏㅂ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 } { "token": "ㅇㅏㅂㅓ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 } { "token": "ㅇㅏㅂㅓㅈ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 } { "token": "ㅇㅏㅂㅓㅈㅣ", "start_offset": 0, "end_offset": 11, "type": "word", "position": 0 } { "token": "아버지/N", "start_offset": 0, "end_offset": 3, "type": "N", "position": 0 } { "token": "방/N", "start_offset": 4, "end_offset": 5, "type": "N", "position": 1 } { "token": "들어가/V", "start_offset": 6, "end_offset": 9, "type": "V", "position": 2 } 한글자모분석기 은전한닢s
  • 22.
    ELASTICSEARCH CLIENT • Elasticsearch클라이언트 • 재사용 가능한 객체 • 내부적으로는 curl –XGET ‘localhost:9200’ 과 같은 원리
  • 23.
    INDEX(인덱스) 생성 • IndicesAPI 사용 • 인덱스명과 인덱스에 사용할 분석기 지정 • 자동완성어의 경우 : 자모분석기 사용 • 영화 검색의 경우 : s은전한닢 분석기 사용 movie_autocomplete movie
  • 24.
    인덱스 필드 매핑설정 컬럼내용 Type Analyzer 예 movieCd 영화코드 keyword - 20173732 movieNm 영화이름 text 은전한닢s 살아남은 아이 prdtYear 개봉년도 integer - 2017 genreAlt 장르 종류 Keyword (array) - 드라마,가족 movie_autocomplete movie 컬럼 내용 Type Analyzer 예 movieCd 영화코드 keyword - 20173732 movieNm 영화이름 text 한글자모분석 살아남은 아이 prdtYear 개봉년도 integer - 2017 genreAlt 장르 종류 Keyword (array) - 드라마,가족
  • 25.
    데이터 색인 • BulkAPI 를사용해서 데이터 색인 • 색인이 이루어지는 동안에도 조회가 가능 (준실시간 검색 가능)
  • 26.
    데이터 조회 및집계 • Search API 사용 자동완성어 검색 영화 검색 집계 movie movie_ autocomplete
  • 27.