Mapping이란?
Mapping은 필드가 저장되고 인덱싱되는 방식을 정의하는 프로세스다. Elasticsearch는 명시적으로 필드를 정의하지 않아도 데이터 유형에 따라 데이터 타입에 대한 매핑 정보가 자동으로 생성된다. 하지만, 자신이 원하지 않는 타입으로 지정될 경우 수정이 불가능하므로 상황에 따라 필드에 미리 매핑정보를 정의해야 하는 경우가 있다.
Field Data Type
Field | Type | 설명 |
Text | keyword | 입력된 문자열을 하나의 토큰으로 저장한다. 검색 시 필터링, 정렬, 집계 시 많이 사용하며, 별도의 분석기를 거치지 않기 때문에 키워드 등 정확한 검색을 할때 유용 |
text | 입련된 문자열을 쪼개어 역색인 구조로 만든다. | |
Numeric | long | 64비트 정수 |
integer | 32비트 정수 | |
short | 16비트 정수 | |
byte | 8비트 정수 | |
double |
64비트 실수
|
|
float |
32비트 실수
|
|
half_float |
16비트 실수
|
|
scaled_float | 실수형이지만 부동소수점이 아니라 long 형태로 저장하고 옵션으로 소수점 위치를 지정 | |
Date | date | ISO8601 형식을 따라 입력되며, 형식이 안맞으면 text, keyword로 인식하여 저장 "2019-06-12" "2019-06-12T17:13:40" "2019-06-12T17:13:40+09:00" "2019-06-12T17:13:40.428Z" |
Boolean | boolean | true와 false 두가지 값을 갖는 필드 보통 term 쿼리를 이용해서 검색 |
Object | object | 한 요소가 여러 하위 정보를 가지고 있는 경우 |
Nested | nested | 필드에 여러개의 object 값들이 서로 다른 역색인 구조를 갖도록 할때는 Nested 타입으로 지정 |
조회 방법
Elasticsearch에서는 검색을 위해 JSON을 기반으로 하는 QueryDSL을 사용하여 점수를 계산하고 점수로 검색 결과를 정렬한다.
Query DSL
Match all Query
모든 문서를 검색하는 쿼리이다.
// match all 검색 예시
{
"query" : {
"match_all": {}
}
}
Match Query
텍스트, 숫자, 날짜 등 색인된 데이터와 일치하는 문서를 찾는 기본 필드 검색 쿼리이다.
Match 검색은 기본적으로 or 검색이 되며 and 검색을 하고 싶은 경우에는 operator 값을 and로 변경해주면 된다.
( ex : '플레티어 테크팀' 으로 검색 시 or 검색이면 플레티어 or 테크팀으로 각각 검색되어 검색 결과가 나온다.)
// 상품명 검색 예시
{
"query" : {
"match": {
"goodsNm": {
"query": "상품"
}
}
}
}
// 상품명 and 검색 예시
{
"query" : {
"match": {
"goodsNm": {
"query": "상품",
"operator" : "and"
}
}
}
}
Match phrase Query
구문 전체가 띄어쓰기까지 일치하는 문서를 검색하는 쿼리이다.
// 상품명 검색 예시
{
"query" : {
"match_phrase": {
"goodsNm": "플래티어 테크팀"
}
}
}
Term Query
term 쿼리는 정확한 키워드가 포함된 문서를 검색한다. match 쿼리와 비슷하지만 text 필드를 조회 시 주의해야하는 사항이 있다. "플래티어 테크팀"이란 문자열이 있을때 text 타입은 [플래티어,테크팀]으로 역색인이 되는데 term으로 "플래티어"를 검색하면 문서를 찾을 수 있지만 "플래티어 테크팀"으로 검색 시 결과가 검색되지 않을 수 있다.
// 브랜드 검색 예시
{
"query" : {
"term": {
"brandNo": {
"value": "11000"
}
}
}
}
Query string Query
매개변수에 다양한 질의문을 사용해서 사용할 수 있는 쿼리이다. 개인적으로는 like 검색을 사용하기 위해 사용하였다.
// 상품명 like 검색 예시
{
"query" : {
"query_string": {
"default_field": "goodsNm",
"query": "*상품*"
}
}
}
Bool Query
bool 의 조건으로는 must, filter, should, must_not이 이 있으며, 조건들의 조합으로 적용하여 검색 결과를 찾아낼 수 있다.
- must : 모든 query가 일치하는 문서 검색
- filter : 모든 query가 일치하는 문서 검색 (score에 영향x)
- should : query가 하나라도 일치하는 문서 검색
- must_not : 모든 query가 일치하지 않는 문서 검색
// bool 검색 예시
{
"query" : {
"bool": {
// '프로모션' 값이 들어간 데이터 검색
"must": [
{
"query_string": {
"default_field": "goodsNm",
"query": "*프로모션*"
}
}
],
// must가 있으므로 '상품'이 없어도 검색
"should": [
{
"query_string": {
"default_field": "goodsNm",
"query": "*상품*"
}
}
],
// '플래티어' 값이 안들어간 데이터 검색
"must_not": [
{
"query_string": {
"default_field": "goodsNm",
"query": "*플래티어*"
}
}
]
}
}
}
Range Query
범위를 지정하여 해당하는 값을 가지고 있는 문서를 검색한다.
파라메터는 아래 4가지가 있다.
- gte : 이상
- gt: 초과
- lte : 이하
- lt : 미만
// 상품가격 범위 검색 예시
{
"query" : {
"range": {
"salePrc": {
//1000원이상 10000원 이하 상품 검색
"gte": 1000,
"lte": 10000
}
}
}
}
Function score Query
검색 필드로 부스팅하여 스코어를 조정하는 것보다 좀 더 디테일하게 스코어링 하기위해 사용하는 쿼리
- boost_factor : 단순 상수를 곱하여 계산
- field_value_factor : 카운트된 값 등의 숫자형 필드를 검색할 시 사용
- script_score : 스크립트 표현식을 사용하여 가장 자유도가 높은 스코어링 방식
- random_score : 문서를 랜덤하게 정렬할때 사용
- decay function : 특정 필드 값을 이용하여 스코어를 줄여가는 함수
- offset : origin에서 스코어가 줄지 않는 거리
- origin : 스코어가 가장 높은 지점
- scale : origin에서 멀어지는 단위
- decay : scale당 줄어드는 단위
// decay 검색 예시
{
"query": {
"function_score": {
"query": {
"match_all": {}
},
"functions": [
{
"gauss": {
"goodsRegDtm": {
"origin": "now",
"scale": "7d",
"decay": 0.9
}
}
}
]
}
}
}
Aggregation
Aggregation은 데이터를 지표, 통계 또는 기타 분석으로 요약한다.
- Metirc Aggregation : avg, min, max, sum 등 주로 통곗값 계산으로 사용
- Bucket Aggregation : range, terms 등 주로 특정기준에 맞춰서 grouping 하는 용도로 사용
// aggregation 검색 예시
{
"query": {
"match_all": {}
},
"aggs": {
"category": {
"nested": {
"path": "dispCtgNo"
},
"aggs": {
"category_keyword": {
"multi_terms": {
"size": 10000,
"terms": [
{
"field": "dispCtgNo.dispCtgNo.keyword"
},
{
"field": "dispCtgNo.ctgFullPath.keyword"
},
{
"field": "dispCtgNo.ctgFullPathNm.keyword"
}
]
}
}
}
}
}
}
'Tech 공유 세미나 - 2차' 카테고리의 다른 글
[발표용] X2UI AUTO TESTER 소개 (0) | 2023.11.22 |
---|---|
3장. 검색 속도 비교와 형태소 분석 (0) | 2023.11.21 |
1장. Elasticsearch의 특징 및 알고리즘 (0) | 2023.11.20 |
3장 플래티어의 구독형 DataLake 구축과 데이터 수집 전략 (0) | 2023.11.20 |
2장 Apache NiFi 활용 사례와 데모 (0) | 2023.11.20 |