Elasticsearch Fulltext 검색서비스적용기 기술 VS 서비스 아프리카 TV 정경석 2018.10.18
Whoami? 아프리카TV 검색 / 캐시클러스터 기술서저자 2015(netty), 2017(cache) soscon 발표 명실상부한콩라인 Redis Netty Elasticsearch
Purpose of the talk 기술 VS 서비스
첫번째이야기 게시물본문검색!
게시물본문검색 게시물의본문내용이검색되면돼!!! Like 쿼리쓰면되겠네. 간단하지?
고민 시간이좀걸려도제대로된방법을찾을것인가? 이상과현실의괴리 일정!!
첫번째접근 개발자친화적인방법 Select no, title, from bbs_table where contents like % 배틀그라운드 % 데이터가많아질수록 사용자가많아질수록 Disk IO, CPU 리소스 Full!!!
두번째접근 개발자친화적인방법 2 + Plugin Select no, title, from bbs_table where match(content) against( ' 배틀그라운드 ' ) 성능과결과는괜찮다. 아직까지는 데이터가많아지고검색할필드가더많아지면? 수평확장불가. 대안이필요하다!!
세번째접근 검색엔진도입 Elasticsearch Apache Solr 대비검색트렌드상승세 다양한플러그인과에코시스템 실시간인덱싱 잘정리된공식문서 수평확장과분산처리 가즈아!!!
Elasticsearch 적용 설치와실행 wget https://artifacts.elastic.co/downloads tar xvf elasticsearch-xxx vi config/elasticsearch.yml bootstrap.system_call_filter: false bin/elasticsearch -d 쉽군!!
Elasticsearch 적용 데이터인덱싱 https://www.elastic.co/guide/en/elasticsearch/client/javaapi/current/transport-client.html org.elasticsearch.client.transport.transportclient org.elasticsearch.action.bulk.bulkrequest org.elasticsearch.action.bulk.bulkprocessor Java, JavaScript, Groovy,.NET, PHP, Python 예제가많아서허들이적음 (Ctrl+C, Ctrl+V)
Elasticsearch 적용 질의 Rest API POST bbs_index/_search {"query":{"term":{"contents":" 배틀그라운드 "}},"from":0,"size":10} {"took":159,"timed_out":false,"_shards":{"total":5,"successful": 5,"failed":0},"hits":{"total":12755, 데이터가잘나오는군!!
Elasticsearch 적용 그러나 POST bbs_index/_search {"query":{"term":{"contents":" 배틀 "}},"from":0,"size":10} {"took":62,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":425, 어?!!
Elasticsearch 내부로.. 형태소분석 의미를가지는최소단위 로잘라내는행위 감나무에감이절로열렸다. 감나무에 / 감이 / 절로 / 열렸다 감 ( 어근 )/ 나무 ( 어근 ) / 에 ( 조사 ) / 감 ( 어근 ) / 이 ( 조사 ) / 절로 ( 어근 ) / 열 ( 어근 ) / 리 ( 피동접사 ) / 었 ( 선어말어미 ) / 다 ( 어말어미 ) 나는개발자인가국어학자인가?!
Elasticsearch 내부로.. 검색과형태소분석왜? 감나무에감이 를검색하면 옆집감나무에감이, 대추나무에대추가열린것을보니... 감나무에달린감이가을을재촉하네요. 행복한감나무농장의감이익어갑니다. 매장뒤뜰감나무에감이주렁주렁 네이버검색결과
Elasticsearch 내장형태소분석기 Built-in Standard Analyzer Whitespace Analyzer Stop Analyzer Pattern Analyzer Custom analyzer Combined, third-party-plugin ( 아리랑, 은전한닢, open korean text, Nori)
Elasticsearch 형태소분석기 plugin 아리랑형태소분석기 Github : https://github.com/howookjeong/elasticsearch-analysis-arirang http://jjeong.tistory.com/category/elastic/elasticsearch
한글형태소분석기적용 아리랑형태소분석기 POST bbs_index/_search {"query":{"term":{"contents":" 배틀그라운드 "}},"from":0,"size":10} {"took":29,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":12375, Good
한글형태소분석기적용 아리랑형태소분석기 POST bbs_index/_search {"query":{"term":{"contents":" 배틀 "}},"from":0,"size":10} {"took":29,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":18351, 괜찮군
한글형태소분석기적용 아리랑형태소분석기 POST bbs_index/_search {"query":{"term":{"contents":" 불닭먹방 "}},"from":0,"size":10} {"took":29,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":8, 응?
형태소분석기테스트 POST _analyze {"analyzer":"arirang_analyzer","text":" 불닭먹방 "} { } "tokens": [ ] { } "token": " 불닭먹방 ", "start_offset": 0, "end_offset": 4, "type": "korean", "position": 0 불닭, 먹방이사전에등록되어있지않음.
원인 쿼리결과이상의원인은사전 아리랑형태소사전 total.dic synonym.dic extension.dic compounds.dic josa.dic 검색되지않는단어가또나오면?
기획자가원했던건 Like 검색
형태소분석기변경 N-gram 1-gram, 2-gram, 3-gram 아버지가방에들어가신다 아버, 버지, 지가, 방에, 들어, 어가, 가신, 신다
형태소분석기변경 N-gram POST bbs_index/_search {"query":{"match":{"contents":" 불닭먹방 "}},"from":0,"size":10} {"took":29,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":421, 기획자가원했던결과가출력됨.. 오버하지말자
쿼리 핵불닭볶음면먹방 slop : 형태소간의거리 { "query": { "match_phrase": { "content": { "query": " 불닭먹방 ", "slop": 3 } } } 적당한값은항상테스트를통해서.
원점으로돌아와서 자연어검색이란 의미가같은글을검색할수있도록하는일련의행위문을닫는다 문 ( 명사 ) 닫다 ( 품사분해 ) 시피유가격 CPU 가격, 시피유가격, 씨피유가격 ( 동의어처리 ) 건물사이길 건물사잇길, 건물샛길 ( 맞춤법교정 ) 서비스에맞는기술선택인가? 게시판검색, 아이디검색 적정기술!
기술적관점의 Elasticsearch 형태소분석기 문장을적절하게 (?!) 분해및 Tagging 한글형태소분석과사전 ( 불닭, 먹방 ) 분석기내부구조 매핑 (Schemaless?) 쿼리 필드타입, 형태소분석기바인딩 term, match, match_phrase, regexp 형태소분석과검색 인덱싱, 쿼리 더많은기능들은모두레퍼런스문서에!!
형태소분석기기본구조 <Lucene interface> Text Character filter Stream Tokenizer Token Token Filter Token Standard Analyzer Character filter : None Tokenizer : StandardTokenizer Token Filter : StandardFilter Token Filter : LowerCaseFilter Token Filter : StopFilter N:1:N
형태소분석기더깊이 Filter chain, Template method 패턴 <Elasticsearch plugin interface> <Lucene interface> Character filter Tokenizer <Arirang, MeCab( 메카부 )> Token Filter Custom 형태소분석기작성시 2~3 개의프로젝트필요!
Elasticsearch 매핑 필드 Type, 형태소분석기 { "mappings": { "bbs": { "properties": { "contents": { "type": "text", "analyzer": "my_ngrams" }, "date": { "type": "date" }, "name": { "type": "keyword" }, "user_id": { "type": "long" } string vs keyword vs text
Elasticsearch Query DSL Elasticsearch 의 SQL match_all term exists prefix match match_phrase https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html
기술적관점의 Elasticsearch 형태소 Tagging 형태소분석기별 tag 의이름값이다름. Tokenfilter, 검색의도파악
기술적관점의 Elasticsearch 분석기와검색의관계 키워드와문서모두형태소분석 Elasticsearch 저장 / 질의 문서 색인 형태소분석기 검색어 사용자
두번째이야기 동의어검색
동의어검색
동의어 동의어사전등록 글자는다르지만같은의미를가진단어 배그 배틀그라운드 가난 빈곤 칭구 친구 블소 블레이드소울 댕댕이 멍멍이 (?) 띵작 명작 (?) 사전관리필요!
동의어사건 씽크홀을검색했는데검색결과가없음 CS. - 기대결과 : 한나가들려주는싱크홀이야기
씽크홀 네이버는?
씽크홀 구글은?
씽크홀 구글은?
씽크홀 아프리카 TV 는?
씽크홀처리방법결정 네이버 : 싱크홀, 씽크홀두결과를합쳐서출력 구글 : 검색어를싱크홀로변경한결과와변경전결과출력 ( 케바케 ) 아프리카 TV : 오탈자검증시스템이없으므로동의어처리결정.
네이버와구글의씽크홀 사실은 국립국어원 : 씽크홀 (X), 싱크홀 (O) 네이버국어사전 : 씽크홀 (X), 싱크홀 (O) 구글 : 씽크홀을오탈자로인식 correction! 네이버 : 씽크홀을싱크홀의동의어로처리
씽크홀 그래서아프리카 TV 는?
못다한이야기들. 형태소분석기만바꿔서는드라마틱한변화없음. 형태소분석기의품질 == 사전과 Tokenizer의품질 ES 6.4의플러그인작성 ES 소스코드의 gradle esplugin Split brain S/W down 시발생 사전관리의실패는서비스장애 장애방지를위한방안수립필요
감사합니다.