엘라스틱 서치 실무 가이드 정리

송은우·2022년 11월 19일
0

TIL

목록 보기
34/61

https://www.slideshare.net/rudaks94/202204pdf-251744601

를 통해 정리한 글입니다

검색 엔진 : 웹에서 정보를 수집해 검색 결과를 제공하는 프로그램

검색 시스템 : 검색 엔진을 기반으로 구축된 시스템을 통칭하는 용어

검색 서비스 : 검색 엔진을 기반으로 구축한 검색 시스템을 활용해 검색 결과를 서비스로 제공한다

수집기 : 크롤러
스토리지 : 데이터베이스에서 데이터를 저장하는 물리적인 장소
색인기 : 데이터 가공 후 저장, 역인덱스 구조로 변환
검색기 : 검색어를 받아 일치하는 문서를 찾아서 반환

인덱스 : 데이터베이스
샤드 : 파티션
타입 : 테이블
문서(document): 행
필드 열
매핑 스키마
query dsl : sql

restful 하게 작동한다
get put post head delete
head는 인덱스 정보

장점

루씬 기반 검색엔진
전문 검색
통계 분석
스키마리스
restful api
멀티테넌시 : 하나의 인스턴스로 여러 사람에게 서비스 제공
document oriented : 계층형
역색인 inverted index
확장성과 가용성
데이터는 샤드라는 작은 단위로 나뉘어 저장되며 데이터를 분산해서 빠르게 처리할 수 있다

단점

실시간 아님
트랜잭션 없음
업데이트 없음

하나의 물리적인 노드에 여러 인덱스 가능
하나의 인덱스가 여러 노드에 분리도 가능
모두 소문자, 인덱스 없이 데이터 추가시 알아서 생성됨

샤드 : 인덱스 내부에 색인된 데이터는 물리적인 공간에 여러 개의 파티션으로 나뉘어 구성되는데 이 파티션을 샤드라고 한다
타입 : 논리적 구조
필드 : 문서 구성 위한 속성
매핑 : 필드, 속성 정의 하고, 색인 방법 정리 프로세스

구성

마스터 노드 : 클러스터 관리(노드 추가 제거같은 작업)
클러스터와 관련된 전반적인 작업. 다수 노드가 마스터로 설정은 가능하지만 결국 하나

데이터 노드 : 데이터 저장(검색, 통계 같은 작업)
문서가 실제로 저장되는 노드
마스터와 분리하는 것 추천

코디네이팅 노드 : 사용자 요청을 노드에게 나눠주는 로드밸
런서
라운드로빈 방식(그냥 온 순서대로 모듈러)으로 분산만 시켜줌

인제스트 노드 : 문서의 전처리 작업. 형식 변경 가능
스크립트 정의시 전처리 파이프라인 구성 및 실행 가능

클러스터와 노드
하나 클러스터 여러 노드
이 과정에서 마스터 노드가 잘 취합해서 전달함
하나의 노드 여러 샤드

9200에 rest api 통신 가능
스키마 리스는 텍스트와 키워드를 둘다(멀티필드) 넣어버리기에 성능상 문제
text 타입 : 기본적으로 standard Analyzer 로 설정됨

인덱스 생성

단순 문자열 : keyword, 형태소 분석 : text
매핑 변경 불가능. 삭제후 다시 생성해야됨

문서 관리 api
single document api 한 건의 문서 처리
multi document api 다수의 문서 처리

POST에다 id가 붙는다면 그 id로 저장됨
id 지정 안 하면 id가 그대로 추가됨
url 에 파라미터를 붙혀서 조회 가능 id로 조회 가능
body에 넣어서 조회도 가능

쿼리에 size, from source, sort, query, filter 까지 가능함
집계 api : 각종 통계 데이터 실시간 제공 가능

버킷 집계 : 문서의 필드를 기준으로 버킷을 집계
매트릭 집계 : 추출한 값을 통해 수학적 평균, 같은 연산
매트릭스 집계 : 행렬합, 곱
파이프라인 집계 : 결과를 통해 다시 한 번 집계

매핑

변수 타이핑처럼 숫자 후 문자가 안됨

  1. 문자열 분석인지
  2. _source 어떤필드 정의할 것인지
  3. 날짜 필드는?
  4. 필드 없이 그냥 유입되는 필드는?

analyzer : 형태소 분석 text 타입은 기본임
normalizer : term query 분석을 위해 사용됨
ascii folding을 통하면 대소문자 무시후 검색도 가능
boost : 필드에 가중치 부여
coerce : 자동 형변환 여부 "10"
copy_to : 복사해서 keyword, text 둘다도 될 수 있음

fielddata : 힙공간 메모리 캐시
최신은 doc_values 를 통해 처리함 text를 제외하고
fielddata는 메모리 캐시이기에 비싸기에 text같은 거는 최소한으로 쓴다

doc_values : 기본 캐싱
루씬 기반 캐싱 방식임

필드 생성 규칙
dynamic
true : 알아서 생성해줌
false : 색인은 안되지만, _source에서 볼 수는 있음
strict : 새로운 필드 예외

enabled : 검색 결과에는 보이지만, _source에서는 무시
생성 날짜 같은 컬럼

format : 날짜, 시간을 문자열로 출력 yyyydd
ignore_above : 일정 길이 넘어가면 빈 문자열로 저장됨. 빈 값 주의
index: 색인 여부 기본값 true
field : 다중 필드

norms : _scores 계산에 정규화 여부 단순 필터링 비활성화 디스크 절약
null_value : 기본 생성 안함. true시 생성
position_increment_gap: 같은 부분은 단어 간 간격 허용 여부
properties : 오브젝트 타입, 네스티드 타입 생성시 생김. 필드의 타입을 매핑한다 오브젝트나, nested 타입에는 properties라는 서브 필드 있음
search_analyzer: 같은 설정으로 특이한 색인기 추가
similarity : 유사도 측정 알고리즘 변경 가능
store : 필드만 자체적으로 저장 가능
term_vector : 분석 용어도 포함할지 여부 체크

메타필드

_index : 인덱스 명
_type : 매핑 타입 정보
_id : 문서 식별 키
_uid : #을 통해서 내부에서만 사용하는 식별 키
_source : 문서에 원본데이터
_routing : 특정 샤드에 저장을 하기 위한 키, 검색시도 붙혀야됨

타입

keyword : 그냥 문자 그대로 일치해야지 검색됨. 형태소 분석이 안됨
여기서는 boost, doc_value, index, null_value, store 까지 가능함

text: 토큰화 됨. 기본 standard analyzer 있음
analyzer, boost, fielddata, index,
norms : 유사도 점수 고려시 필드 길이 고려할 지 고민
, store, search_analyzer, similarity,
term_vector : analyzed 필드에 텀 벡터를 저장할 지 여부

array : 모두 같은 타입이어야 한다
byte, short, int, long, half_float, float, double 까지 있음
데이터 타입
iso 시간, 문자열 시간, 밀리초 모두 가능. 내부적으로는 utc 밀리초로 통일됨

range
int, long, float, double, date, ip까지 범위로 설정 가능

boolean
geo-point 위도 경도
ip 타입 가능
object 타입 : property로 설정. 내부 타입만 명시함
nested 타입 : object+ 배열도 가능
배열은 or 연산이기에 주의
nested는 and

텍스트 분석

analyzer api로 어떻게 형태소가 쪼개지는지 확인 가능
standard 는 조사 분리 못함
분석기 구조는 3가지
1. Character Filter : 원문을 특정한 조건으로 변경함
예를 들면 toLowerCase
2. Tokenizer Filter : 1개만 가능. 어떻게 토큰으로 쪼갤 것인지
3. TokenFilter : 동의어, 유의어까지 고민해줌

색인과, 검색 2가지를 나눌 수도 있음

Standard Analyzer
공백과 특수기호로만 구분, 소문자 분할이 끝
옵션들
3가지
1. max_token_length : 길어지면 자름. 기본값 255
2. stop_words : 불용어
3. stop_words_path : 불용어 위치
whiteSpace, keyword,

Character Filter : 전처리 필터는 활용도가 떨어짐. Tokenizer Filter에서 처리가 일부 가능
html 제거 필터

Ngram 토크나이저 : 한 글자씩 기본 토큰. 특정 글자를 만날 때마다도 가능함. 최소, 최대 길이도 가능
edge ngram 은 단어를 만날 때마다 시작부터 모든 부분 다 잘라냄 Ha, Har Harr Harry

keyword : 완벽한 일치만 받음
ascii folding : 아스키 아닌 것을 아스키로 변환
lower case, upper case
stop : 불용어 가능
stemmer 필터도 있음. 분해한 이후에 다시 원형이 되는지도? 확인
synonym 동의어 보통 파일로 관리함
trim 공백 제거

동의어가 자주 변경되는 경우에는 검색에만 동의어를 이용하는 경우도 있음

index, get, delete, update, bulk: 여러개, reindex : 문서 복사
이렇게가 가능함

문서 id가 필요함 없으면 알아서 생성함
버전 : 최초1 업데이트마다 증가함. 업데이트시 스냅샷을 내부적으로 생성하고, 이를 업데이트 하는 방식으로 진행함. 이때 스냅샷 이후에 업데이트 전에 버전이 바뀌었다면 업데이트 실패
예전 버전은 날아감
or_type=create를 넣으면 생성이 무조건 일어나야되고 업데이트시 에러

새로운 필드 만들 시 에러가 날지를 선택해야됨
auto_create_index
index : 특정 인덱스 추가시 사용
_shards : 몇 개의 샤드가 복제되어야 하는지를 나타냄
total : 총 수
successful : 성공한 수

delete 인덱스명도 가능함
쿼리로도 삭제 가능 _delete_by_query_라는 내용으로 쿼리도 가능

대량 생성은 무조건 bulk api로 한 번에 색인 가능
reindex: 다른 문서로 복사

검색

uri 검색
body 검색
query dsl을 통해서 검색하려면 문법에 맞춰 json을 만들어야 함
쿼리 컨텍스트: 복잡한 질의 분석기를 통해 거쳐야 하기에 느림
필터 컨텍스트: yes,no 분석기가 아니라 그냥 db를 통해 date비교 같은 것인데, 오히려 빠름

기본적으로 모든 요청은 multi index, multi type 이 가능함
인덱스 이름 * 와일드 카드 가능
paging : size, from
정렬 : sort
모두 json형태로 반환됨
lt, gt, lte, gte

기본적으로 or 연산이 작동함
operator로 and 명시 가능
minimum_should_match : 최소 텀 매칭 수 "harry 포터" 인 경우는 and처럼 작동함

fuzziness : 알파벳인 경우 유사어를 체크해줌. 한글은 적용 힘듦
boost: 제목, 본문 같은 구조 가중치
match_all : 만족 조건 모든 것 보통 색인에 저장된 문서 확인에 쓰임
match_query : 형태소 분석이 발생하는 검색. 여기도 or연산이 기본
multi_match : 여러 필드 동시 검색
term_query : keyword 검색
boolean_query : 여러 조건문 가능
query_string : 내장 쿼리 분석기 이용. 이때 공백이 연산자가 아니라 그냥 문자가 됨 그대로 형태소 분석기 가버림
prefix_query : 시작부분 검색
exist_query : 필드 생성된 부분, null 없는 부분만 뽑아냄
wildcard 쿼리 : 시작에 와일드 카드를 절대 넣으면 안됨. 그러면 모든 문서 다 검색됨
nested_query 쿼리 : join비슷한 연산을 수행해줌. 부모가 특정되었을 때. child만 검색이 가능함
검색 요청 발생시 모든 샤드에 다 검색 질의를 던지고, 기다림. 조합해서 반환

레플리카를 적당히 구분해서 검색할 때, 기본은 라운드 로빈. 동적 분배도 알고리즘이 있음
global timeout 설정을 해주는 쪽이 좋음. 모든 요청에 동일하게 특정 시간 지나면 fail

multi_search 하기
여러 index에서 동시 검색 가능함
count 로 일치 문서 숫자만 검색도 가능
validate 작성시 쿼리 올바르게 작성되었는지 체크도 가능
explain 얼마나 유사한지 정보 제공. 어떻게 점수 계산되었는지도 확인 가능
profile 쿼리 시간에 대한 로그 남겨줌

profile
학생의 마음가짐으로 최선을 다하자

0개의 댓글