3. 엘라스틱 서치 기본
- 분석기 : 역인덱스를 위해 문자열을 나누는 기준이 중요한데 이를 지원하기 위한 모듈
- 분석기의 구성 : 캐릭터 필터 (전처리 과정), 토크나이저(like 형태소 분리), 토큰 필터(후처리 과정)
- ex) standard, simple (숫자, 특수문자 제외 토큰화), whitespace(공백 기준 토큰화), stop (simple과 유사하지만 stop 필터 추가)
- 필터
- 캐릭터 필터 : 문자 전처리, 대부분의 제공되는 분석기에선 사용하지 않으므로 사용하고 싶으면 커스텀 분석기를 만들어 사용해야 함
- 토큰 필터 : 토크나이저에 의해 토큰화되어 있는 문자들에 필터를 적용
- 커스텀 분석기
- 필터 적용 순서 : [필터1, 필터2]로 구성되어 있으면 필터1 -> 필터2 순으로 적용됨. 소문자로 먼저 변경한 다음에 다른 필터를 적용하는 것이 실수를 줄인다.
4. 엘라스틱 서치 : 검색
쿼리 컨텍스트 vs. 필터 컨텍스트
- 쿼리 컨텍스트 : 질의에 대한 유사도 스코어를 계산 -> 더 적합한 결과를 먼저 보여줌.
- 필터 컨텍스트 : 유사도 계산 x -> 일치 여부에 따른 결과만 반환
- 유사도 스코어에 대한 계산이 없으므로 전체적인 쿼리 속도가 빠르다.
- 결과에 대한 업데이트도 매번 수행할 필요가 없으므로 캐싱이 가능하다.
- _search : 검색 쿼리 사용 REST API ex) GET kibana_sample_data_ecommerce/_search
- match : 전문 검색을 위한 쿼리 -> 역인덱싱된 용어 검색 시 사용
쿼리 스트링 vs. 쿼리 DSL
- 쿼리 스트링 예시 : GET kibana_sample_data_ecommerce/search?q=customer_full_name:Mary
- 쿼리 DSL : json 형태.
유사도 스코어 (기본 알고리즘 : BM25)
- BM25 : TF (Term Frequency), IDF (Inverse Document Frequency)
- IDF 계산
- 문서 빈도 : 전체 도큐먼트들을 아울러 일반적으로 자주 등장하는 용어 (to, the, 그리고, 그러나 등등)는 중요하지 않다. 따라서 발생 빈도가 낮을 수록 가중치를 둔다. = 문서 빈도의 역수 (Inverse Document Frequency)
- IDF 계산식 : log(1 + (N - n + 0.5) / (n + 0.5) ) -> 로그가 나온다고? 문과덜덜..
- n = 검색했던 용어가 몇 개의 도큐먼트에 존재하는가 (검색 결과 hit 한 total 문서 수)
- N = 인덱스 내 전체 도큐먼트 수
- TF 계산
- 용어 빈도 (특정 용어가 한 도큐먼트에서 얼마나 빈번히 등장했는가) : 자주 등장 시 도큐먼트의 주제일 가능성이 높다.
- TF 계산식 : freq / (freq + k1 * ( 1 - b + b * dl / avgdl) )
- freq = 도큐먼트 내에서 용어가 나온 횟수
- k1, b = 알고리즘을 정규화하기 위한 가중치로 디폴트 상수값
- dl = 필드 길이 (현재 도큐먼트의 해당 필드를 토큰화했을 때 토큰 수)
- avgdl = 전체 도큐먼트에서 평균 필드 길이 (인덱스 내의 모든 도큐먼트를 토큰화했을 때 도큐먼트 당 갖는 평균 토큰 수)
- dl이 낮고 avgdl이 클수록 TF 값이 크다. (찾고자 하는 용어가 포함된 텍스트가 짧을 수록 가중치가 높다)
- 최종 스코어 계산식 : boost (고정 상수 2.2) * IDF * TF
- 완벽하게 이해는 못했지만.. 대략 IDF는 전체 도큐먼트에서 해당 용어가 적게 나오면 높은 수치, TF는 도큐먼트의 길이 대비해서 용어가 많이 나오면 높은 수치.. 라는 것 같다.
쿼리
- 리프 쿼리 : 특정 필드에서 용어를 찾는 쿼리
- 전문 쿼리
- 전문 검색을 위해 사용
- 전문 검색할 필드는 인덱스 매핑 시 꼭 텍스트 타입으로
- 용어 수준 쿼리
- 정확히 일치하는 용어를 찾기 위해 사용
- 키워드 타입으로 매핑
- RDB의 where 절과 유사
- 복합 쿼리 : 쿼리를 조합해 사용하는 쿼리
리프 쿼리 > 전문 쿼리
- 매치 쿼리
- _source : 쿼리 결과에서 보여주려고 하는 필드들을 선택
- “mary bailey” 가 검색된다면 검색어를 “mary”, “bailey”로 토큰화 -> 매치 쿼리에서 공백은 디폴트로 or 취급한다. 따라서 mary 혹은 bailey를 포함한 도큐먼트들이 검색된다.
- 공백을 and로 취급하고 싶다면 “operator” : “and” 옵션을 주면 된다.
'TIL > 엘라스틱 서치' 카테고리의 다른 글
Elastic Search : Complete Guide to ElasticSearch - 낙관적 동시성 제어 (0) | 2024.01.14 |
---|---|
Elastic Search : Complete Guide to ElasticSearch - 도큐먼트 라우팅 (0) | 2024.01.08 |
Elastic Search : Complete Guide to ElasticSearch - 도큐먼트 관리 (0) | 2024.01.08 |
Elastic Search : Complete Guide to ElasticSearch - 클러스터링과 샤딩 (1) | 2024.01.04 |
Elastic Search : 엘라스틱 스택 개발부터 운영까지 - 1 (1) | 2024.01.03 |
댓글