글제목 : es 세미나
페이지 정보
본문
매핑 Elasticsearch의 매핑(mapping)은 관계형 데이터베이스의 스키마(schema)와 유사한 역할을 합니다
동적매핑 : 처음 색인되는 문서를 바탕으로 매핑 정보를 엘라스틱서치가 동적(자동)으로 생성
-- 스키마리스가 아니라 단지 미리 정의하지 않아도 될 뿐이다.
정적매핑 : 문서의 매핑 정보를 사용자가 미리 정의하여 생성
-- 어떤 문서가 색인될지 스키마를 미리 정의한다.
&& 정적매핑의 필요성
필요성 1. (동적매핑에 의해 원하는 타입을 지정해줄 수 없으니) 문서들의 필드들이 가지는 값에 따라 타입을 지정해 줄 필요가 있을 때 , 중요하지 않거나 타입을 지정할 필요가 없을 경우엔 엘라스틱서치가 자동으로 매핑을 하여 줌
필요성2.동적매핑으로 문자열을 넣을 시 엘라스틱서치는 자동으로 text 필드와 keyword 타입 2개의 타입을 넣어주니 불필요한 색인이 발생함. 따라서 문자열 특성에 따라 text , keyword를 정적 매핑을 해주면 성능에 도움이 됨
그렇게 넣는 이유 : 사용자에게 유연한 검색 기능 제공(문자열 필드를 두 가지 타입으로 매핑함으로써, Elasticsearch는 사용자가 어떤 종류의 검색을 원하든지 대응할 수 있도록 되어있음)
- 매핑 정보가 생성된 후에는 타입이 안 맞을 경우 파싱 에러가 발생
(숫자 -> 문자열) 하지만 (3 -> "3") 이면 색인이 되는 유연함.
매핑을 잘못 설정한 경우 재색인(reindex)하거나 다시 새로운 인덱스 생성하는 방법 밖에 없다.
매핑 파라미터
Copy_to
269 필드 하나로 통일
279 fields
필드가 많을 경우에 여러 개를 적어야 하니(fields) 하나로 공통으로 묶고 싶을 경우 사용 가능하다.
291 dynamic ->
동적 매핑(dynamic mapping)을 제어하는 옵션으로 처음 매핑 시 다른 새로운 필드가 들어올 경우 에러를 발생함 (strict) // 기본값 true
<333 새로운 필드를 추가하여 에러 발생>
새로운 필드가 인덱싱되더라도 매핑에 추가되지 않으며 이 경우, 해당 필드는 인덱스에서 무시되고 저장되지 않는다(.false)
format -> 사용자가 지정한 format 형식에 벗어날 시 파싱 에러가 발생함 // 데이터형식 통일
338 format 형식이 달라 에러 발생
334 형식이 같아 색인 성공
null_value -> 값이 없거나(374) null(369)일 시 필드에 설정된 null_value 값이 대신 나옴
ignore_above
keyword 타입 필드에서 문자열 길이가 지정한 범위를 초과할 때 해당 값을 인덱싱하지 않으므로 검색 시 결과에 나타나지 않는다
ignore_malformed
true : 필드의 값이 매핑된 데이터 타입과 일치하지 않을 경우, Elasticsearch는 해당 값을 무시하고 오류를 발생시키지 않으며 이는 잘못된 형식의 데이터를 무시하고 색인 작업을 계속 진행할 수 있도록 함
false : 필드의 값이 매핑된 데이터 타입과 일치하지 않으면, Elasticsearch는 파싱 오류를 발생시키고, 해당 문서는 색인되지 않습니다. 이 설정은 데이터의 정확성을 보장하고, 형식이 잘못된 데이터를 저장하지 않도록 합니다.
Index false로 설정한 해당 필드는 검색되지 않는다.
Enabled(폐기 이유:) 성능 최적화와 설정의 단순화 때문
search_analyzer 검색 시 검색어를 분석하는 데 사용되는 분석기를 지정합니다. 107페이지
---------------------------------------------------------------------------------------------------------
메타필드
Elasticsearch가 인덱스와 문서를 관리하는 데 필요한 정보를 제공
1. _index 메타 필드
해당 문서가 속한 인덱스 이름을 담고 있습니다. 이를 이용해 검색된 문서의 인덱스명과 해당 인덱스에 몇 개의 문서가 있는지 확인할 수 있습니다.
2. _type 메타 필드
해당 문서가 속한 매핑의 타입 정보를 담고 있습니다. 이를 이용해 인덱스 내부에서 타입별로 몇 개의 문서가 있는지 확인할 수 있습니다.
3. _id 메타 필드
문서를 식별하는 유일한 키 값입니다. 한 인덱스에서 색인된 문서마다 서로 다른 키 값을 가집니다. 사용자가 직접 id를 넣을 수 있다.
4. _uid 메타 필드
특수한 목적의 식별키입니다. "#" 태그를 사용해 _type과 _id 값을 조합해 사용합니다. 하지만 내부적으로만 사용되기 때문에 검색 시 조회되는 값은 아닙니다.
5. _source 메타 필드
문서의 원본 데이터를 제공합니다. _reindex API나 스크립트를 사용해 해당 값을 계산할 때 해당 메타 필드를 활용할 수 있습니다.
6. _all 메타 필드
색인에 사용된 모든 필드의 정보를 가진 메타 필드입니다. 모든 필드의 내용이 하나의 텍스트로 합쳐져서 제공됩니다. 특정 필드가 아닌 문서 전체 필드에서 특정 키워드를 검색한다면 _all 메타 필드를 사용하면 됩니다.
_all 메타 필드는 데이터 크기를 너무 많이 차지하는 문제가 있어 엘라스틱서치 6.0 이상부터는 폐기(deprecated) 됐습니다. (copy_to 파라미터 대체)
7. _routing 메타 필드
특정 문서를 특정 샤드에 저장하기 위해 사용자가 지정하는 메타 필드입니다. 별도의 설정이 없다면 문서를 색인하는 문서는 샤드에 골고루 분산되어 저장됩니다.
----------------------------------------------------------------------------------------------------
text , keyword 타입
text
색인 시 지정된 분석기가 컬럼의 데이터를 문자열 데이터로 인식하고 이를 분석함
문장 형태의 데이터에 적합한 타입임
전문 검색 가능
정렬이나 집계(Aggregation) 사용 X
정렬이나 집계 연산을 사용해야할 때, Text 타입과 Keyword 타입을 동시에 갖도록 멀티 필드로 설정하여 이용할 수 있음
keyword
키워드 형태로 사용할 데이터에 적합한 데이터 타입
별도의 분석기를 거치지 않고 원문 그대로 색인
정형화된 콘텐츠에 주로 사용됨
일부 기능은 형태소 분석을 하지 않아야만 사용 가능한데, 이 경우에도 Keyword 데이터 타입을 사용함
keyword 타입을 사용해야하는 경우 : 집계(Aggregation) 사용, 정렬, 검색 시 필터링
공통점
모두 문자열을 처리하기 위한 타입.
차이점
text 타입은 전문 검색을 위해 토큰이 생성 되지만 keyword 타입은 Exact Matching(정확하게 일치)를 위해 토큰(단일 토큰)이 생성됨.
- 토큰이 생성 되는 것은 분석기를 통해서만 이루어진다.
keyword 타입은 텍스트를 분석하거나 토큰화하지 않기 때문에 CPU 리소스를 덜 사용하며 텍스트를 변형하지 않고 그대로 색인하기 때문에 색인 속도가 더 빠름
용도에 따라 text , keyword 타입을 지정해야 함
만약 두 개 사용하고 싶으면 동적매핑처럼 매핑을 설정해도 됨.
Match 쿼리
텍스트 검색에 사용됩니다.
용도: 긴 문장이나 문단처럼 분석된 텍스트 필드에서 원하는 단어나 문장을 찾을 때 사용합니다.
작동 방식: 검색어를 분석해서(단어로 나누고, 소문자로 변환하고 등) 텍스트 데이터에서 유사한 내용을 가진 문서를 찾아줍니다.
사용 예시:
사용자가 "Elasticsearch 사용법"이라고 검색하면, 제목이나 내용에 "Elasticsearch", "사용법" 또는 이와 관련된 단어들이 포함된 문서들을 찾아줍니다.
장점: 부분 일치와 관련성 점수를 고려해서 결과를 제공합니다. 즉, 검색어와 완전히 일치하지 않더라도 관련성이 높은 문서를 보여줍니다.
Term 쿼리
정확한 값 검색에 사용됩니다.
용도: 데이터가 분석되지 않은 키워드 필드에서 정확하게 일치하는 값을 찾을 때 사용합니다. 숫자, 날짜, ID와 같은 데이터를 검색할 때도 사용됩니다.
작동 방식: 검색어와 필드의 값이 정확히 일치하는 문서만 찾아줍니다. 분석(토큰화, 소문자 변환 등)을 하지 않고, 입력한 단어 그대로 검색합니다.
사용 예시:
상태가 "active"인 사용자만 찾고 싶다면, term 쿼리를 사용하여 "status" 필드가 정확히 "active"인 문서만 찾습니다.
장점: 정확한 일치를 보장합니다. 실수로 인한 잘못된 데이터 검색을 방지할 수 있습니다.
요약 비교
match 쿼리는 분석된 텍스트에서 부분 일치나 유사한 내용을 찾을 때 사용합니다.
term 쿼리는 분석되지 않은 데이터에서 정확히 일치하는 값을 찾을 때 사용합니다.
- 역색인
역색인(Inverted Index): 엘라스틱서치에서 텍스트 검색을 빠르고 효과적으로 수행하기 위해 사용하는 데이터 구조입니다.
문서가 들어오면 분석기를 통해 단어를 토큰화하여 역색인(Inverted Index)을 생성합니다. 엘라스틱서치는 각 단어가 어떤 문서에 있는지 역색인 구조로 저장합니다.
검색어를 입력하면 역색인에서 해당 단어가 포함된 문서 ID를 찾아, 해당 문서의 원본 데이터를 반환합니다.
사용이유
- 빠른 검색: 어떤 단어가 포함된 문서를 빠르게 찾을 수 있어 검색이 아주 빠릅니다.
- 효율적: 많은 문서가 있을 때도 빠르게 원하는 정보를 찾을 수 있습니다.
*전처리 필터(pre-processing filter)**란, 데이터가 분석되거나 색인되기 전에 데이터를 준비하고 변환하는 작업을 수행하는 구성 요소입니다. 엘라스틱서치에서는 **인제스트 파이프라인(Ingest Pipeline)**을 통해 전처리 필터를 사용하여 데이터를 색인하기 전에 원하는 형태로 변환할 수 있습니다.
- 분석기(Analyzer)
텍스트 데이터를 색인하고 검색하기 위해 텍스트를 분석하는 데 사용되는 구성 요소 이며 분석기는 텍스트를 처리하여 검색 가능한 형태로 변환하는 역할
- 문장을 특정한 규칙에 의해 수정 (Character Filter)
- 입력된 텍스트에 대해, 문장 분석 전 특정 단어를 변경하거나 HTML과 같은 태그를 제거
- 텍스트를 개별 토큰화하기 전의 전처리 과정
- ReplaceAll() 패턴 혹은 사용자가 정의한 필터를 통해 변경
- 텍스트를 어떻게 나눌 것인가를 정의
- 언어에 따라 적절한 Tokenizer 사용 가능
- 분석기당 하나만 사용할 수 있다.
- 토큰화된 단어를 하나씩 필터링하여 사용자가 원하는 토큰으로 반환
- 여러 단계가 순차적으로 이뤄지며, 어떻게 순서를 지정하냐에 따라 검색의 질이 달라짐
- 여러 개를 사용할 수 있다 즉, 하나의 Analyzer 내에 여러 Token Filter를 체인처럼 연결하여 사용할 수 있음
불용어
불용어는 검색이나 분석에서 중요하지 않다고 판단되는 단어들(검색에 제외됨)
- 관사: "a", "an", "the"
- 접속사: "and", "or", "but", "so", "nor"
- 전치사: "in", "on", "at", "by", "with", "from", "to", "of"
- 대명사: "he", "she", "it", "they", "we", "I", "you"
- 동사: "is", "are", "was", "were", "be", "been", "being"
- 형용사: "this", "that", "these", "those", "some", "any", "every", "no"
동의어 : 의미가 비슷하거나 동일한 단어
A는 B와 같다 라고 표현
- 다음글ALM 중에 Redmine 지원 계획이 있으실까요? 24.04.01
댓글목록
등록된 댓글이 없습니다.