기본 컨셉
- Elastic에서 Apache Lucene을 기반으로 만든 분산 검색 엔진 / NoSQL
기본 용어
- document
- field
- index
- document를 모아 놓은 단위. 이 index단위로 Elasticsearch에 검색을 요청.
- index는 여러 shard로 쪼개져서 분산 저장.
- _id
- index 내 문서에 부여되는 unique identifier
- index 이름과 id의 조합은 Elasticsearch 클러스터 내에서 unique.
- 엄밀히 말하자면 인덱스와 _id의 조합을 클러스터 내에서 고유하게 유지하는 책임은 사용자에게 있음.
- type
- 예전에는 하나의 index 안에 여러 document를 묶어서 type이라는 논리 단위로 나눴지만, 이 개념은 폐기 ex) 소설이라는 index 안에서, A장르/B장르 처럼 나누는 경우
- ES 6부터 index 하나에 type 하나만 두도록 제한
- ES 7부터는 여러 API에서 type을 명시하는 것 자체가 deprecated.
- type 이름이 들어가야 할 자리에 기본값인 _doc이 들어간 API를 사용
- ES 8부터는 type을 명시하는 API 자체가 없어졌음.
기본 구조
- 1개의 index는 여러 shard로 쪼개져서 저장
- 0, 1 : 샤드 번호 / server : 노드 / 빨간색 : primary shard / 검은색 : replica

Lucene과 index / shard
- 색인 요청이 들어오면 document 분석 → Luecene이 inverted index 생성
- document의 index/updqate/delete 등이 수행되면 Lucene이 이러한 변경을 메모리에 들고 있다가 주기적으로 디스크에 flush → 이를 refresh라고 함
- refresh 단계까지 온 데이터가 검색의 대상이 된다
- Lucene의 IndexReader는 열린 시점에 색인이 완료된 문서만 검색 가능 → 새로운 결과를 얻기 위해서는 IndexReader를 새로 열어줘야함

- Lucene의 flush(ES refresh)는 커널 시스템 캐시에 데이터 write 보장 → 디스크 기록 보장하지 않음
- 주기적으로
fsync()
syscall로 디스크 기록 → Lucene commit(ES Flush)
- 변경마다 commit 수행은 비용이 바쌈 → 각 ES Shard는 작업마다 translog라는 작업 로그를 남김
- 색인/삭제 작업이 Lucene index에 수행된 직후에 translog 기록 → 작업 acknowledged
- crash가 발생한 경우 ack되었지만 commit에 포함되지 못한 내용은 shard recovery 단계에서 translog를 읽어 복구
- ES Flush가 일어나면 translog 초기화 → 로그 크기 적절한 수준 유지
- 디스크에 translog에 성공적으로
fsync()
되고 commit 됐을때만 성공을 보고.

- 이렇게 기록된 파일들이 모여 1개의 segment
- segment 자체는 immutable한 데이터로 구성 (삭제 플래그를 두고 merge시 실제 삭제)
- → 새로운 문서 삽입 혹은 변경되면 새로이 segment 생성
- → Lucene이 중간중간 segment merge로 단일 segment로 모음 수행