최근에 Elasticsearch를 공부하고 있는데요. 하면 할 수록 헷갈리는 개념들이 많아 제가 아는 만큼 간단히 정리해보려 합니다. 틀린 부분이 있으면 바로 댓글 달아주세요!
참고로 ES에 입문하기에 해당 가이드만큼 쉬운 게 없다고 생각합니다. 저는 종민북이라 불러요 :)
정리 (6/3)
- RDB의 Database / Table / Row를 ES의 Index / Type / Document라고 대응시키곤 한다. 그런데 이는 잘못된 설명이다. ES 7 버전에선 하나의 인덱스에 하나의 타입만 설정할 수 있다(사실상 쓰지 말라고 한다). 따라서 인덱스를 하나의 테이블, 도큐먼트를 하나의 로우와 비슷하다 해도 무방하다.
- bool query : 복잡한 쿼리를 구현하기 위해 여러 쿼리를 조합한 쿼리
- bool query의 인자는 must, must_not, should, filter 4가지
- bool query 인자들 안에 필요한 쿼리들(match, match_phrase, term, range, ...)들을 배열로 넣는 방식
- ES에서 색인한다 = 역색인 구조로 토큰에 문서 ID를 저장한다.
- text 필드타입 : analyzer를 사용해, 토큰 단위로 쪼개어 색인한다.
- keyword 필드타입 : analyzer를 사용하지 않고, 입력된 문자열을 그대로 하나의 토큰으로 색인한다.
- (불확실) 전문검색(Full-Text Search) : "나는 밤에 잠을 잤다"와 같은 텍스트를 분석하여 여러 토큰으로 저장하면 특정 문자열을 검색할 수 있다. 문자열에 특수한 인덱스를 생성해 빠르게 검색할 수 있다
- 멀티필드 : 하나의 필드 값을 여러 방법으로 색인 가능. dynamic field mapping으로 문자열은 보통 text with .keyword로 저장된다. 또한 한 필드에 여러 analyzer를 적용 가능하다.
- 매핑 정보를 추가하는 건 가능하지만, 이미 생성된 매핑은 변경 불가
- 매핑 설정 시 문자열 analyze가 필요한지 / _source에 어떤 필드를 정의할 것인지 / 날짜 필드는 어떻게 매핑할 건지? / 매핑에 없는데 유입되는 필드는 어떻게 처리할 것인지? 고려
- boost는 이제 검색 시에만 설정 가능하다.
- 색인 boost는 field length normalization factor으로 relevancy에 영향을 주기 때문이다.
- _source 메타 필드는 원본 JSON 문서를 검색 결과로 표시하지만, 내부적으로는 색인된 정보가 저장된다.
- ES에서 Date 데이터 타입은 3가지로만 표현할 수 있다.
- 문자열이 포함된 날짜('2021/04.20') / ISO_INSTANT 포맷 날짜('2011-12-03T10:15:30Z') / 밀리세컨드
- Date 데이터 타입은 내부적으로 모두 UTC 밀리세컨드로 변환해서 저장한다.
-
query 설명 match 1. 검색어 analyze
2. text 타입에 적합term 1. 검색어 analyze X
2. keyword 타입에 적합match_phrase 1. 검색어 analyze
2. 토큰들이 모두 일치 + 순서 일치하는 문서 반환
3. slop 허용 (임의 검색어가 끼어드는 것)
정리 (6/16)
- Query context는 query clause와 문서가 얼마나(How) 잘 매칭되는지 따져보는 문맥이고, filter context는 query clause와 문서가 매칭되는지(Does) 따져보는 문맥이다.
- Query context에 속한 쿼리절은 relevance(관련성)을 계산하는 대신 캐싱되지 않고, filter context에 속한 쿼리절은 보통 캐싱된다.
- search API에 사용할 수 있는 쿼리 파라미터 중, query는 쿼리절을 정의하겠다는 뜻
- 모든 query clause는 query context 또는 filter context 둘 중 하나에 속한다.
- 모든 query clause는 compound query clause 또는 leaf query clause 둘 중 하나로 분류된다.
- Compound query clause는 다른 leaf / compound query를 포함하여, 복합적인 검색 조건을 만들거나 그들의 행동을 변경한다.
- Compound query clause의 대표적인 예시로 복합 검색을 만드는 boolean query(bool)이 있다. 행동을 변경시키는 constant_score query도 있다.
- Leaf query clause는 쿼리의 가장 마지막(leaf)에 위치하여, 검색할 필드의 값을 지정한다.
- Leaf query clause의 대표적인 예시로 match, match_phrase, term, range가 있다.
- Boolean query 중 must, should는 query context / must_not, filter는 filter context에 속한다.
댓글