Database/Elaticsearch 6

Elastic Search

Elastic SearchRESTful 분산형 검색 및 분석Features분산형, 고가용성 검색 엔진모든 인덱스는 설정된 갯수만큼 Shard이 된다.각각의 Shard은 하나 이상의 replica를 가지고 있는다.Read / Search는 어느 Replica Shard에서나 작동이 된다.멀티 테넌트 (Multi Tenant)1개의 이상의 인덱스의 쿼리Index Level 설정 가능 (shard의 갯수, index 저장소)HTTP RESTFul APINative Java APIDocument 기반의 문서준 실시간 검색 (Near Real Time Search)비동기 Write

Lucene Segment

Lucene Segment루씬 세그먼트 Inverted Index, Doc Value, 원본 문서 등을 저장하고 있는 단위 파일Inverted Index?RDBMS를 데이터를 테이블형태로 저장한다id: 1, value : name검색엔진에서는 inverted index라는 구조로 저장token: name, doc id : 1, 2Invertered Index를 하나의 거대한 파일이 아니라 여러개의 작은 파일 단위로 저장입벽 버퍼가 가득차거나, 1초마다 하나씩 생성한번 생성된 세그먼트는 변경이 되지 않는다.문서 변경/삭제 과정update는 존재하지 않음, delete & insert삭제는 삭제되었다는 표시만 하고 검색에서 제외세그먼트 병합 과정에서 삭제된 문서를 빼고 나머지 문서들을 모아 새로운 새그먼트를..

로그성 데이터의 날짜 기반의 index 설계

- 주로 Elastic Search를 사용하는 use-case가 로그 분석, 사용자 행동 분석 등을 사용한다.- 하지만 로그 분석 등의 데이터는 규모가 따라 다르지만 양이 생각보다 많다.- Document를 지우는것은 비용이 비싼 연산에 포함이 된다.- Document를 지우는 것보다는 Index를 삭제하는 것이 싼 연산이다.- 따라서 index 이름에 날짜를 포함시켜 시간이 지난 index는 삭제하는 방법이다 좋다.- index의 Type Mapping은 Template 기능을 이용하면 된다. ex)server_log-2018.01.01server_log-2018.01.02....

term aggregation 기능 사용하기

- SQL의 Group by의 기능을 필요하다면 Terms Aggregation을 사용하면 된다.- AVG, MAX 등의 데이터는 Metric Aggregation을 참고를 하면 된다- SQL의 distinct 기능으로 활용될수도 있다. - 참고자료 : https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html - Example SQL SampleSELECT genre, count(*) FROM docs GROUP BY genre - Term Aggregation QueryGET /_search{ "aggs" : { "genres" : { "terms" : { ..

_source를 이용하여 원하는 필드만 선택하기

- ElasticSearch Query를 사용하다보면 필요한 데이터만 가지고 오고 싶을때가 있다. 그럴 경우에는 "_source" 필드를 사용하여 데이터를 선택할수가 있다.- 하나의 데이터가 큰 경우에는 _source를 이용하여 네트워크 비용을 줄일수가 있다.- 참고 : https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html - 필드를 선택을 하지 않는 경우 GET /_search{ "_source": false, "query" : { "term" : { "user" : "kimchy" } }} - nested 구조의 필드를 선택하는 경우GET /_search{ "_source":..

Elastic Search Nested Query

Nested Query- document에서 list의 object가 있는 구조- 일반적인 DB에서의 1:N 구조를 하나의 document에 포함시키는 구조로 갈수가 있다. Nested MappingPUT /my_index{ "mappings": { "type1" : { "properties" : { "obj1" : { "type" : "nested" } } } }}- Type : nested GET /_search{ "query": { "nested" : { "path" : "obj1", "score_mode" : "avg", "query" : { "bool" : { "must" : [ { "match" : {"obj1.name" : "blue"} }, { "range" : {"obj1.count" :..