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"
}
]
}
}
}
}
}
}
'검색엔진 > Elasticsearch' 카테고리의 다른 글
[Elasticsearch] 형태소 분석과 검색 속도 비교 (0) | 2023.11.29 |
---|---|
[Elasticsearch] Elasticsearch 필드 데이터 타입 (1) | 2023.11.17 |
[Elasticsearch] Elasticsearch 알고리즘 (0) | 2023.11.14 |
[Elasticsearch] Elasticsearch 기본 개념 및 장단점 (0) | 2023.11.07 |