전체보기(316)
-
Jackson Error - InvalidDefinitionException: Direct self-reference leading to cycle
Direct self-reference : 자기 자신을 참조하는 멤버변수가 존재할 때 발생하는 에러 문제 상황 @Data public class Parent { public String message; } @Data public class Child extends Parent{ public String message; public Parent getParent() { return (Parent) this; } } Child childInstance = new Child(); ObjectMapper objectMapper = new ObjectMapper(); System.out.println(objectMapper.writeValueAsString(childInstance)); 문제 해석 ObjectMa..
2019.04.16 -
Elasticsearch 활용 (성능 최적화)
하드웨어 관점 CPU 하이퍼 스레딩 포함 32코어 까지 대응. 32 코어 보다 크면 너무 많은 스레드가 생성되어 OOM 이 발생한다. CPU 사용률이 60% 이상이면 CPU 확장을 고려해보는 것이 좋다. RAM 최대 32 GB. 32GM 이상이면 GC 수행시 성능 저하가 염려된다. Disk SSD 네트워크 분산 구조를 지원하므로 클러스터 관점이 더 좋다. Document 관점 Shard의 크기를 결정하는 기준 1. 데이터 노드의 갯수와 맞춘다. 가장 손쉽게 생각할 수 있는 방법. 2. CPU 코어의 갯수와 맞춘다. ES가 병렬 처리 기반이므로. 3. Document의 데이터 크기 샤드의 물리적인 크기는 50GB 이하인 것이 좋으므로. 인덱싱 처리량을 늘리는 가장 쉬운 방식이 샤드를 늘리는 것. 샤드의 크..
2019.04.13 -
Elasticsearch 활용 (Analyzer, Aggregation)
엘라스틱서치 : 2014 기준 자동완성 - 전방일치 : 엘라 -> 엘라스틱 - 부분일치 : naver -> www.naver.com - 후방일치 : 청바지 -> 남자청바지 자동완성을 구현하는 방법론 1. Prefix 쿼리 2. Suggester 3. ngram Analyzer 4. edge ngram Analyzer Analyzer 용도에 맞는 Tokenizer를 사용한다. Tokenizer 일반 텍스트를 인덱스하기위한 의 작은 요소로 분할하는 방식 Tokenizer 종류 : https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html Filter Tokenizer에 들어가기전에 일반 텍스트를 가공하는 방식..
2019.04.13 -
스프링 부트 - Shedlock
클러스터 환경에서 @Scheduled 한번만 띄우기 공식 : https://github.com/lukas-krecan/ShedLock 참조 : https://www.baeldung.com/shedlock-spring ShedLock 특징 1. [아파치 2.0 라이센스] 이다. 2. 클러스터 환경에서 하나의 노드만 스케줄링을 실행하도록 도와준다. 3. Annotation 방식으로 문제를 해결한다. Quartz 를 대신할 수 있는 괜찮은 대안. Quartz 보다 가볍다. Quartz 는 클러스터 안의 서버 노드들 중 스케줄링을 수행할 서버를 Quartz 가 고르고 방식이다. 반면 Shedlock 의 동작 방식은 다르다. Shedlock에서는 모든 서버 노드들이 Scheduling을 수행하려고 시도한다. 각 ..
2019.04.09 -
Analyzer와 Tokenizer
Analyzer 가 필요한 이유 Elastic search는 Default Analyzer 가 Edge-nGram Analyzer다. fox 라는 데이터를 저장하면 f, fo, fox 으로 analyze하고 데이터를 인덱싱하여 저장한다. 그런데 사용자가 fox를 찾고싶은데 앞에 철자가 기억안났다고 치자. localhost:9200/animal/_search { "query" : { "term":{ "species":"ox" } } } 라고 검색했는데 소(ox) 만 검색되고 여우(fox)가 검색이 안된다. 이렇게만 되면 이게 무슨 검색엔진인가. fox 라고 데이터가 저장되면 f, o, x, fo, ox, fox 이렇게 분석하고 인덱싱하는 Analyzer를 적용하길 원한다. 즉 nGram 방식의 분석기가 필..
2019.04.07 -
Properties에서 Index 필드의 설정값, Search 짧은 지식
Index : true (text) Index : analyzed 분석해서 인덱싱하여 저장 Index : false (keyword) Index : not_analyzed 분석하지 않고 데이터를 그대로 인덱스에 저장 Index : no 분석하지 않고 인덱스에도 저장하지 않음. 이 필드는 검색할 수 없다. 문서를 찾았을 때 출력용으로만 사용 가능하다. search filter : Score 계산 후 sorting x 스코어 반환 x query : Score 계산 후 sorting o 스코어 반환 o Term 쿼리 : 검색 요청을 받은 검색어를 analyze 안한고 그대로 쿼리한다. Match 쿼리 : 검색 요청을 받은 검색어를 analyze 하고 이것들을 term 쿼리한다.
2019.04.06