분류 전체보기
-
Elasticsearch(with lucene) DocValue 에 대해서 알아보자elasticsearch 2021. 2. 27. 14:09
루씬은 검색을 효율적으로 하기위해 역색인 구조로 저장하는데 검색 시에는 유리한 구조이지만 정렬, 집계일 경우에는 그렇지 않다 그래서 그것을 보안하기 위해 DocValues란 구조를 사용한다 루씬은 4.0부터 컬럼 기반인 DocValues라는 개념을 도입했다 DocValues는 메모리를 효율적으로 사용하기 위해 jvm heap 메모리가 아닌 운영체제 os의 파일 시스템 캐시를 사용해 색인 시 디스크를, 검색시 시스템 캐시를 이용하는 디스크 기반 데이터 구조이다 즉 컬럼 기반의 구조를 채택해 힙 메모리 사용에 영향을 주지 않으며 힙 메모리를 사용하는 것과 같은 성능을 낸다 참고로 엘라스틱서치에서는 JVM 힙 메모리를 fielddata(uninverted)라고 부르는 특별한 구조로 사용 한다. 또한 JVM의 ..
-
elasticsearch translog는 왜 필요할까?elasticsearch 2021. 2. 24. 21:19
엘라스틱 서치는 샤드에 일어나는 모든 변경사항을 담고 있는 특수 형태 로그이며 고가용성 장애 복구를 위한 백업 데이터 및 데이터 유실 방지를 위해 사용된다 해당 파일의 로그는 언제 삭제될까? 삭제 되는 시점은 fsync() 실행되는 시점 즉 es 기준 flush 루씬기준 commit이 발생해 디스크로 쓰여지고 난 뒤 쓰여진 내용은 로그파일에서 제거된다 Translog의 동작 순서 데이터가 추가되면 Translog에 기록되고 동시에 인메모리 버퍼에 추가된다. Refresh가 수행되면 인메모리 버퍼에서는 사라지지만 Translog에는 계속 남아있다. 더 많은 데이터가 추가되고 지속적으로 세그먼트가 생성된다. Translog가 일정 크기 이상으로 커지면 Flush 작업이 수행된다. 시스템 캐시의 내용이 디스크..
-
elasticsearch function_scoreelasticsearch 2021. 2. 22. 20:11
전에 사용했던 similarity를 function_score로 구현해볼 것이며 similarity는 아래 링크를 참조하자 https://ksk-developer.tistory.com/25 function_score는 score를 조작 할 수 있도록 해주고 기본 적으로 tf-idf와 bm25를 사용하게 되는데 현재 요구사항에는 그것 때문에 적용이 되지 않았다 그래서 score를 조작할 수 있는 function_score를 사용하기로 하였다 아래 코드는 실제 동작하는 코드이지만 필드명과 쿼리의 상당부분을 제거와 변경하였다 GET test/_search { "from": 0, "size": 10, "timeout": "200ms", "query": { "function_score": { "query": { ..
-
elasticseaarch eager global ordinal를 사용해 퍼포먼스를 올려보자elasticsearch 2021. 2. 20. 13:19
문자열 fielddata의 메모리 사용을 줄이는 기술중 하나가 ordinal이다 cardinality가 작은 status필드 가진 10억개의 문서가 있다고 생각해보자 status_deleted, status_pending, status_published라는 세가지 상태 값이 있고 10억개면 이 전체를 메모리에 유지하기 위해서는 1나당 14 ~ 16 바이트가 필요하며 전체 데이터로는 약 15gb가 필요하다 이처럼 비싼 비용을 들이는 대신 세개의 교유 한 문자열을 식별, 정렬해서 번호를 매긴다 0, 1, 2 이처럼 하게 되면 아래와 같이 메모리 사용량이 15gb에서 1gb미만으로 줄게 된다 문자열 보단 숫자가 용량을 훨씬 더 적게 먹기 때문이고 비교 연산, 네트워크 등등에서 많은 이점을 가지고 갈 수 있게 ..
-
elasticsearch similarity module 이용해서 score 수정하기elasticsearch 2021. 2. 15. 21:51
오늘 내가 필요했던 요구사항은 해당 필드에 해당 키워드가 존재하면 그 키워드가 존재하는 문서의 score 값이 동일하게 나오기를 바랬다 브랜드 무 무신사 스탠다드 엘무드 커버낫 위의 표처럼 브랜드가 있을 때 "무"라는 키워드로 검색하면 무, 무신사 스탠다드, 엘무드 이 세가지 값이 나오게 되는데 해당 3가지의 score이 tf-idf에 의해서 값이 다 다른데 무, 무신사, 엘무드를 포함하는 문서는 15000이라는 값을 상수로 주고 싶었다 * 사실 요구사항이 더 많았지만 간략하게 기능 소개만 하기 위해 간단하게 예제를 설정 그래서 이것 저것 시도해보다 안되서 나와 같은 니즈를 가진 사람들이 있을 것이라고 생각해 검색해 보다가 내가 커스텀해서 score를 계산할 수 있도록 해주는 similarity modu..
-
세그먼트의 불변성 - 장점elasticsearch 2021. 2. 12. 12:55
세그먼트의 불변성으로 인해 많은 장점을 가져갈 수 있다 1. 불변이기 때문에 동시성을 신경 쓸 필요가 없다 스레드가 데이터를 점유한 상황일 때를 신경 쓸 필요가 없는 것이다 수정이 가능하다면 수정하는 동안 다른 스레드는 접근 불가능하게 한다거나 해서 퍼포먼스가 떨어질 수 있다 2. 엘라스틱 서치는 하나의 필드에 또 여러 개의 필드를 만들어서 사용한다 그런데 수정이 가능하다면 그 수많은 필드의 수많은 Terms를 찾아서 수정해줘야 한다 그리고 그걸 수정하는 동안 해당 데이터가 검색이 안될 수 있다 그래서 불변으로 해서 새로운 세그먼트를 추가해서 기존 데이터는 삭제 비트에 마크만 해주고 나중에 병합으로 백그라운드 스레드에서 처리해서 *리소스도 절감하고 검색도 빠르게 제공할 수 있다 3. 시스템 캐시를 적극 ..
-
webflux로 개발하면서 공부하면 좋을 것 같은 목록흔적 2021. 2. 11. 11:21
1. 프로젝트 전체를 webflux로 개발하다. 물론 전에 자동완성 api를 webflux(tomcat 구조 안에서)로 개발은 했지만 프로젝트 전체를 개발 하기는 처음이였다. 검색개발팀에서 새로운 프로젝트를 webflux로 개발을 하였고 프로젝트 이번 프로젝트는 구조나 첫 개발은 혼자 진행하였다 해당 프로젝트가 처리하는 데이터는 정적 배치, 동적 배치, 실시간 데이터 반영(CDC)를 처리하는 api이다 그래서 많은 요청을 처리 할 수 있는 구조를 찾았고 webflux로 정하였다 2. 개발하면서 많은 많은 시행착오가 있었지만 그것은 있을지 모르는 다음? 글에서 적도록 하고 이번에는 개발을 하면서 어떤 것을 참고했고 참고한 것 중에서 이것을 알고 개발 하면 더 좋을 것 같은 다른 블로거 분들의 링크를 남기도..
-
elasticsearch(with lucene) field_data에 대해서 알아보자elasticsearch 2021. 2. 9. 11:04
예전에 무신사 es 서비스 성능 튜닝을 하기 위해 여러가지 점검을 하였는데 그 중 fielddata, doc_value, eager_global_ordinals에 정리해보려고 한다 doc_value와 eager_global_ordinals은 다음에 작성할 예정이며 오늘은 field_data에 정리해보려고 한다 루씬을 내부적으로 데이터를 역색인하여 저장하고 특정 query에 대해 관련 있는 문서를 얻기 위해서 만들어졌다 그런데 단순 질의뿐만 아니라 집계나 필드 기준으로 정렬하는 것에 대한 요구사항이 있었고 이런 요구사항을 해결하기위해 루씬은 역색인 된 데이터를 univerted하여 컬럼 중심 뷰를 만들게되었다 검색시점이나, close한 인덱스를 다시 open 하거나 할 때 등등 univerted(이것 또한..