본문 바로가기

ElasticSearch3

ElasticSearch parent-child relation ElasticSearch 는 기본적으로 비정규화를 권장한다. 연산시 Join이 필요없고 이로 인해 최고의 성능을 낼 수 있기 때문이다. 그러나 중복된 데이터가 생성될 수 있고 데이터의 수정이 잦은 경우 데이터의 정합성 문제를 가져올 수 있기 때문에 데이터의 용도에 따라 적합한 방법으로 저장하는 것이 좋다. ElasticSearch는 관계형 데이터를 지원하는 parent-child relation 속성이 있다. 이는 1:N 관계를 하나의 인덱스에 표현할 수 있는 기능이다. 상위 부모를 정의하고 그와 관계있는 child를 정의하는 방식이다. - parent-child 맵핑 방법은 다음과 같다. PUT series { "mappings": { "properties": { "film_to_franchise": .. 2022. 7. 24.
ElasticSearch 동시성 제어 만약에 서로 다른 클라이언트가 같은 document를 동시에 업데이트 하게 되면 어떻게 될까? 이 때 동시성 제어를 해주지 않으면 데이터 정합성에 큰 문제가 생길 수 있다. ElasticSearch에서 동시성 처리를 하기 위해서는 Optimistic Concurrency Control 방법을 사용한다. Optimistic Concurrency Control 각 document는 _seq_no 와 _primary_term 이라는 정보가 있다. 특정 데이터를 업데이트 할 때 이 두 값을 사용하면 동일한 document에 대한 두게의 다른 요청 중 하나만 처리되고 다른 하나는 실패한다. 이 때 document가 실패한 경우 자동으로 재요청을 보내도록 설정할 수 있는데 이 때 retry_on_confilct=자.. 2022. 7. 23.
ElasticSearch mapping 엘라스틱 서치에서 맵핑은 인덱스의 스키마를 정의하는 것이다. 엘라스틱 서치는 기본적으로 정의되지 않은 필드의 데이터인 경우 동적으로 타입을 맵핑해주는 기능이 있지만 이 경우 개발자가 의도하지 않은 타입으로 맵핑 될 수 있다. 예를 들어 타임 스탬프를 epochtime 형태로 저장하기 위해 timestamp : 1658564541298 를 저장했다면 해당 필드의 타입이 정적으로 맵핑되지 않았을 시 엘라스틱 서치는 이름 날짜 데이터로 인식하지 못하고 number type로 지정한다. 따라서 의도하지 않은 타입 맵핑을 피하기 위해선 동적 맵핑에 의존하지 않는 것이좋다. 맵핑의 기본 형태는 다음과 같다. { "mappings": { "properties" : { "필드명" : { "type": 타입 } } } .. 2022. 7. 23.