Elastic Search에서 원하는 결과를 도출하는 방법은 크게 두가지가 존재한다.
쿼리와 필터의 주요 차이점은 다음과 같다.
- 검색 결과로 반환되는 문서의 관련성 점수에 영향을 미치는가?
- 캐싱이 되는가?
즉, 쿼리는 관련성 점수를 결정하는 데 사용되고 필터는 결과를 제한하는 데 사용되며,
score가 필요한 경우엔 쿼리를 이용하고, 그렇지 않다면 필터를 사용하면 된다.
_score
API의 메타데이터 필드인데, 점수가 높은 곳일수록자주 사용되는 쿼리에 대한 예제를 살펴보도록 하자.
Match : 특정 필드뿐만 아니라 전체 문서에서 일치하는 항목을 찾는 전체 텍스트 검색 쿼리
POST index_name/_search
{
"query": {
"match": {
"field_name": "value to search"
}
}
}
Term : 특정 필드 또는 특정 문자열의 값과 같은 정확한 값과 일치하는 쿼리
POST index_name/_search
{
"query": {
"term": {
"field_name": "value to search"
}
}
}
위 예시에서 term 쿼리는 필드값이 정확히 ‘field_name’ 인 문서를 찾으며, 대소문자를 구분하며 일부 값과 일치하지 않음.
부분 값을 검색하려는 경우에는 wildcard 쿼리 또는 fuzzy 쿼리를 사용할 수 있음
POST index_name/_search
{
"query": {
"terms": {
"field_name": ["value1", "value2", "value3"]
}
}
}
여러 값을 검색할 수도 있음.
‘field_name’ 필드의 값이 정확히 ‘value1’, ‘value2’, ‘value3’ 인 문서와 일치함
Bool : 여러 쿼리를 부울 논리(예: AND, OR, NOT)로 결합할 수 있는 쿼리
POST index_name/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"field1": "value1"
}
},
{
"term": {
"field2": "value2"
}
}
],
"must_not": [
{
"term": {
"field3": "value3"
}
}
],
"should": [
{
"term": {
"field4": "value4"
}
},
{
"term": {
"field5": "value5"
}
}
],
"minimum_should_match": 1
}
}
}
Range : 지정된 범위 내의 필드 값과 문서를 일치시키는 쿼리
POST index_name/_search
{
"query": {
"range": {
"field_name": {
"gte": "lower_bound",
"lte": "upper_bound"
}
}
}
}
field_name
필드의 값이 lower_bound
보다 크거나 같고upper_bound
보다 작거나 같은 문서와 일치함.gt
(보다 큼),lt
(보다 작음)gte
(보다 크거나 같음)lte
(보다 작거나 같음)POST index_name/_search
{
"query": {
"range": {
"field_name": {
"gt": "lower_bound"
}
}
}
}
field_name
필드의 값이 lower_bound
보다 큰 문서와 일치하는 range 쿼리의 예시POST index_name/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"field1": {
"gte": "lower_bound1",
"lte": "upper_bound1"
}
}
},
{
"range": {
"field2": {
"gte": "lower_bound2",
"lte": "upper_bound2"
}
}
}
]
}
}
}
Aggregation : 하나 이상의 필드를 기반으로 검색 결과를 그룹화하고 요약하는 쿼리
POST index_name/_search
{
"size": 0,
"aggs": {
"group_by_field1": {
"terms": {
"field": "field1"
},
"aggs": {
"average_field2": {
"avg": {
"field": "field2"
}
},
"sum_field3": {
"sum": {
"field": "field3"
}
}
}
}
}
}
위 예시에서는 검색 요청의 aggs 섹션은 두 개의 집계를 지정하는데,
첫 번째 집계인 group_by_field1
은 field1
필드의 값을 기준으로 문서를 그룹화하기 위해 용어 집계를 사용.
두 번째 수준의 집계인 average_field2
와 sum_field3
는 avg
와 sum aggregation
을 사용하여 각 문서 그룹에 대해 각각 field2
와 field3
필드에 있는 값의 평균과 합계를 계산.
size
매개변수가 0으로 설정되어 있으므로, 검색 요청은 실제 문서를 반환하지 않고 집계된 결과만 반환함.
단일 검색 요청에서 여러 aggregation을 사용하여 보다 복잡한 데이터 분석 및 그룹화를 수행할 수 있음.
Elastic Search에는 term Filter, range Filter 및 bool Filter를 포함한 여러 유형의 필터가 존재하는데,
필터 선택은 검색의 특정 요구 사항과 검색 중인 데이터에 따라 달라지게 된다.
브라보! 멋지다 배동준~